2 Confirm sex status sing DNA methylation values

## [1] TRUE
##                       Row.names     xMed     yMed predictedSex realSex
## 1  GSM2808939_5854945043_R03C01 13.39486 10.71210            F       F
## 2  GSM2808940_5854945043_R04C01 12.63866 12.88729            M       M
## 3  GSM2808941_5854945043_R05C01 13.04055 10.40939            F       F
## 4  GSM2808942_5854945043_R06C01 13.28677 10.65374            F       F
## 5  GSM2808943_5854945043_R01C02 12.39178 12.63091            M       M
## 6  GSM2808944_5854945043_R02C02 12.60409 12.81878            M       M
## 7  GSM2808945_5854945043_R03C02 13.41924 10.62388            F       F
## 8  GSM2808946_5854945043_R04C02 13.39158 10.54978            F       F
## 9  GSM2808947_5854945043_R05C02 13.24926 10.63209            F       F
## 10 GSM2808948_5854945043_R06C02 12.39044 12.67881            M       M
## 11 GSM2808949_5854945045_R01C01 12.42285 12.74051            M       M
## 12 GSM2808950_5854945045_R02C01 12.37368 12.66977            M       M
## 13 GSM2808951_5854945045_R03C01 12.73450 13.00885            M       M
## 14 GSM2808952_5854945045_R04C01 13.26298 10.47978            F       F
## 15 GSM2808953_5854945045_R05C01 13.26408 10.53236            F       F
## 16 GSM2808954_5854945045_R06C01 13.08688 10.48382            F       F
## 17 GSM2808955_5854945045_R01C02 12.11309 12.46097            M       M
## 18 GSM2808956_5854945045_R02C02 12.11667 12.45635            M       M
## 19 GSM2808957_5854945045_R03C02 12.65486 12.87517            M       M
## 20 GSM2808958_5854945045_R04C02 12.56332 12.83624            M       M
## 21 GSM2808959_5854945045_R05C02 12.48066 12.75666            M       M
## 22 GSM2808961_5854945056_R01C01 13.13627 10.39339            F       F
## 23 GSM2808962_5854945056_R02C01 12.49035 12.75822            M       M
## 24 GSM2808963_5854945056_R03C01 13.35996 10.64926            F       F
## 25 GSM2808964_5854945056_R04C01 12.71928 13.02574            M       M
## 26 GSM2808965_5854945056_R05C01 12.85214 13.06623            M       M
## 27 GSM2808966_5854945056_R06C01 13.42528 10.78259            F       F
## 28 GSM2808967_5854945056_R01C02 12.45108 12.68650            M       M
## 29 GSM2808968_5854945056_R02C02 12.61102 12.85428            M       M
## 30 GSM2808969_5854945056_R03C02 12.77345 13.07364            M       M
## 31 GSM2808970_5854945056_R04C02 13.47763 10.53625            F       F
## 32 GSM2808971_5854945056_R05C02 13.15014 10.55651            F       F
## 33 GSM2808972_5854945056_R06C02 12.49935 12.75488            M       M
## 34 GSM2808973_5854945057_R01C01 13.30592 10.39714            F       F
## 35 GSM2808974_5854945057_R02C01 12.50767 10.04029            F       F
## 36 GSM2808975_5854945057_R03C01 13.18627 10.48432            F       F
## 37 GSM2808976_5854945057_R04C01 13.44016 10.60918            F       F
## 38 GSM2808977_5854945057_R05C01 12.77582 13.02998            M       M
## 39 GSM2808978_5854945057_R06C01 13.38262 10.77602            F       F
## 40 GSM2808979_5854945057_R01C02 13.23937 10.24317            F       F
## 41 GSM2808980_5854945057_R02C02 13.23691 10.37286            F       F
## 42 GSM2808981_5854945057_R03C02 12.91663 10.19660            F       F
## 43 GSM2808982_5854945057_R05C02 13.40886 10.59898            F       F
## 44 GSM2808983_5854945057_R06C02 13.40221 10.63617            F       F
## 45 GSM2808984_5854945010_R01C01 12.04644 12.24510            M       M
## 46 GSM2808985_5854945010_R02C01 12.94782 10.26562            F       F
## 47 GSM2808986_5854945010_R03C01 13.25820 10.25562            F       F
## 48 GSM2808987_5854945010_R06C01 12.80886 13.01280            M       M
## 49 GSM2808988_5854945010_R01C02 12.31217 12.51607            M       M
## 50 GSM2808989_5854945010_R02C02 13.18936 10.67684            F       F
## 51 GSM2808990_5854945010_R03C02 12.75937 12.95074            M       M
## 52 GSM2808991_5854945010_R04C02 12.88741 13.10648            M       M
## 53 GSM2808992_5854945010_R05C02 12.52613 12.74398            M       M
## 54 GSM2808993_5854945010_R06C02 13.42423 11.03411            F       F
## 55 GSM2808994_5854945021_R01C01 12.96208 10.15924            F       F
## 56 GSM2808995_5854945021_R02C01 12.33330 12.53453            M       M
## 57 GSM2808996_5854945021_R03C01 13.20823 10.48684            F       F
## 58 GSM2808997_5854945021_R04C01 12.59397 12.82137            M       M
## 59 GSM2808998_5854945021_R06C01 13.45950 10.85526            F       F
## 60 GSM2808999_5854945021_R01C02 12.80413 10.25680            F       F

3 Data QC

3.3 Probes QC

Input:

  • RGSet.RDS
  • beta_mat.RDS

Output:

  • beta_CG_XY_SNPfiltered.RDS
## Warning: replacing previous import 'minfi::getMeth' by 'bsseq::getMeth' when
## loading 'DMRcate'
### drop probes where SNP with MAF >= 0.01 in the last 5 bp of the probe
beta_mat <- rmSNPandCH(
  object = beta_mat,
  dist = 5, 
  mafcut = 0.01, 
  and = TRUE,
  rmcrosshyb = FALSE,
  rmXY = FALSE
)
probes.info <- probes.info[row.names(probes.info) %in% row.names(beta_mat),]

nb.probes.cg.dmrcate <- nrow(probes.info)
nb.chrAuto.probes.cg.dmrcate <- sum(probes.info$seqnames %in% paste0("chr", 1:22))
nb.chrX.probes.cg.dmrcate <- sum(probes.info$seqnames == "chrX")
nb.chrY.probes.cg.dmrcate <- sum(probes.info$seqnames == "chrY")
nb.chrM.probes.cg.dmrcate <- sum(probes.info$seqnames == "chrM")

### drop probes in chrM
probes.info <- probes.info[probes.info$seqnames != "chrM",]
beta_mat <- beta_mat[
  row.names(beta_mat) %in% row.names(probes.info),
]

nb.probes.dmrcate.chrM <- nrow(probes.info)
nb.chrAuto.probes.dmrcate.chrM <- sum(probes.info$seqnames %in% paste0("chr", 1:22))
nb.chrX.probes.dmrcate.chrM <- sum(probes.info$seqnames == "chrX")
nb.chrY.probes.dmrcate.chrM <- sum(probes.info$seqnames == "chrY")

save(
  pheno_df,
  beta_mat,
  nb.probes.detectP,
  nb.chrAuto.probes.detectP,
  nb.chrX.probes.detectP,
  nb.chrY.probes.detectP,
  nb.chrM.probes.detectP,
  nb.probes.detectP.cg,
  nb.chrAuto.probes.detectP.cg,
  nb.chrX.probes.detectP.cg,
  nb.chrY.probes.detectP.cg,
  nb.chrM.probes.detectP.cg,
  nb.probes.cg.dmrcate,
  nb.chrAuto.probes.cg.dmrcate,
  nb.chrX.probes.cg.dmrcate,
  nb.chrY.probes.cg.dmrcate,
  nb.chrM.probes.cg.dmrcate,
  nb.probes.dmrcate.chrM,
  nb.chrAuto.probes.dmrcate.chrM,
  nb.chrX.probes.dmrcate.chrM,
  nb.chrY.probes.dmrcate.chrM,
  file = paste0(data.dir.probes.qc, "/beta_CG_XY_SNPfiltered_mat.rda")
)

4 Normalization

  • Quantile normalization and BMIQ normalization

Input:

  • beta_CG_XY_SNPfiltered_mat.RDS
  • RGSet.RDS
  • pheno_df.RDS
  • full.annot.RDS

Output:

  • bs.csv
  • pheno_df.RDS
  • QNBMIQ.RDS

4.1 Quantile normalization

4.1.1 Check if sex chrom have higher/lower intensities than autosomes

4.1.1.2 Compare beta values between gender

4.1.1.3 Boxplot of methylation by chromosomes

4.1.1.3.2 by gender

## quartz_off_screen 
##                 2

4.1.1.4 Boxplot of methylation by gender on autosomes, X, Y

4.1.2 normalization by group

4.1.2.2 normalization

## Perform quantile normalization ...
## [1] 446784     30
## Perform quantile normalization ...
## [1] 10618    30
## Perform quantile normalization ...
## [1] 446784     27
## Perform quantile normalization ...
## [1] 10618    27
## Perform quantile normalization ...
## [1] 62 27

4.2 BMIQ

4.2.1 test percentage of type I and type II probes then normalize the matrix

4.2.1.1 on autosomes

5 Outliers detection - PCA analysis

  • Select most variable probes and perform PCA analysis

Input:

  • GASPARONI_QNBMIQ.rds
  • pheno_df.RDS

Output:

  • GASPARONI_PCs_usingBetas.csv,
  • PCA plots
  • GASPARONI_QNBMIQ_PCfiltered.RDS
  • pheno_df.RDS
## Sourcing https://gist.githubusercontent.com/tiagochst/d3a7b1639acf603916c315d23b1efb3e/raw/a14424662da343c1301b7b2f03210d28d16ae05c/functions.R
## SHA-1 hash of file is ef6f39dc4e5eddb5ca1c6e5af321e75ff06e9362

5.1 for females

## [1] TRUE
## [1] TRUE

5.2 for males

## [1] TRUE
## [1] TRUE

6 Summary after QC steps

6.1 Data and metadata

## [1] 457402     29
## [1] 457464     27
## [1] 29  7
## [1] 27  7

6.2 Numbers of samples and probes removed in each step

7 Session information

## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                       
##  version  R version 3.6.2 (2019-12-12)
##  os       macOS Catalina 10.15.4      
##  system   x86_64, darwin15.6.0        
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/New_York            
##  date     2020-05-06                  
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package                                       * version  date       lib
##  acepack                                         1.4.1    2016-10-29 [1]
##  affy                                            1.64.0   2019-10-29 [1]
##  affyio                                          1.56.0   2019-10-29 [1]
##  annotate                                        1.64.0   2019-10-29 [1]
##  AnnotationDbi                                 * 1.48.0   2019-10-29 [1]
##  AnnotationFilter                                1.10.0   2019-10-29 [1]
##  AnnotationHub                                 * 2.18.0   2019-10-29 [1]
##  askpass                                         1.1      2019-01-13 [1]
##  assertthat                                      0.2.1    2019-03-21 [1]
##  backports                                       1.1.6    2020-04-05 [1]
##  base64                                          2.0      2016-05-10 [1]
##  base64enc                                       0.1-3    2015-07-28 [1]
##  beanplot                                        1.2      2014-09-19 [1]
##  BiasedUrn                                       1.07     2015-12-28 [1]
##  Biobase                                       * 2.46.0   2019-10-29 [1]
##  BiocFileCache                                 * 1.10.2   2019-11-08 [1]
##  BiocGenerics                                  * 0.32.0   2019-10-29 [1]
##  BiocManager                                     1.30.10  2019-11-16 [1]
##  BiocParallel                                  * 1.20.1   2019-12-21 [1]
##  BiocVersion                                     3.10.1   2019-06-06 [1]
##  biomaRt                                         2.42.1   2020-03-26 [1]
##  Biostrings                                    * 2.54.0   2019-10-29 [1]
##  biovizBase                                      1.34.1   2019-12-04 [1]
##  bit                                             1.1-15.2 2020-02-10 [1]
##  bit64                                           0.9-7    2017-05-08 [1]
##  bitops                                          1.0-6    2013-08-17 [1]
##  blob                                            1.2.1    2020-01-20 [1]
##  BSgenome                                        1.54.0   2019-10-29 [1]
##  bsseq                                           1.22.0   2019-10-29 [1]
##  bumphunter                                    * 1.28.0   2019-10-29 [1]
##  callr                                           3.4.3    2020-03-28 [1]
##  cellranger                                      1.1.0    2016-07-27 [1]
##  checkmate                                       2.0.0    2020-02-06 [1]
##  cli                                             2.0.2    2020-02-28 [1]
##  cluster                                       * 2.1.0    2019-06-19 [1]
##  codetools                                       0.2-16   2018-12-24 [1]
##  colorspace                                      1.4-1    2019-03-18 [1]
##  crayon                                          1.3.4    2017-09-16 [1]
##  crosstalk                                       1.1.0.1  2020-03-13 [1]
##  curl                                            4.3      2019-12-02 [1]
##  data.table                                      1.12.8   2019-12-09 [1]
##  DBI                                             1.1.0    2019-12-15 [1]
##  dbplyr                                        * 1.4.3    2020-04-19 [1]
##  DelayedArray                                  * 0.12.3   2020-04-09 [1]
##  DelayedMatrixStats                              1.8.0    2019-10-29 [1]
##  desc                                            1.2.0    2018-05-01 [1]
##  devtools                                        2.3.0    2020-04-10 [1]
##  dichromat                                       2.0-0    2013-01-24 [1]
##  digest                                          0.6.25   2020-02-23 [1]
##  DMRcate                                       * 2.0.7    2020-01-10 [1]
##  DMRcatedata                                   * 2.2.1    2020-02-27 [1]
##  DNAcopy                                         1.60.0   2019-10-29 [1]
##  doParallel                                      1.0.15   2019-08-02 [1]
##  doRNG                                           1.8.2    2020-01-27 [1]
##  dplyr                                         * 0.8.5    2020-03-07 [1]
##  DSS                                             2.34.0   2019-10-29 [1]
##  DT                                              0.13     2020-03-23 [1]
##  edgeR                                           3.28.1   2020-02-26 [1]
##  ellipsis                                        0.3.0    2019-09-20 [1]
##  ensembldb                                       2.10.2   2019-11-20 [1]
##  evaluate                                        0.14     2019-05-28 [1]
##  ExperimentHub                                 * 1.12.0   2019-10-29 [1]
##  fansi                                           0.4.1    2020-01-08 [1]
##  farver                                          2.0.3    2020-01-16 [1]
##  fastmap                                         1.0.1    2019-10-08 [1]
##  FDb.InfiniumMethylation.hg19                  * 2.2.0    2020-03-18 [1]
##  foreach                                       * 1.5.0    2020-03-30 [1]
##  foreign                                         0.8-76   2020-03-03 [1]
##  Formula                                         1.2-3    2018-05-03 [1]
##  fs                                              1.4.1    2020-04-04 [1]
##  genefilter                                      1.68.0   2019-10-29 [1]
##  GenomeInfoDb                                  * 1.22.1   2020-03-27 [1]
##  GenomeInfoDbData                                1.2.2    2020-03-18 [1]
##  GenomicAlignments                               1.22.1   2019-11-12 [1]
##  GenomicFeatures                               * 1.38.2   2020-02-15 [1]
##  GenomicRanges                                 * 1.38.0   2019-10-29 [1]
##  GEOquery                                        2.54.1   2019-11-18 [1]
##  ggplot2                                       * 3.3.0    2020-03-05 [1]
##  ggpubr                                          0.2.5    2020-02-13 [1]
##  ggrepel                                       * 0.8.2    2020-03-08 [1]
##  ggsignif                                        0.6.0    2019-08-08 [1]
##  glue                                            1.4.0    2020-04-03 [1]
##  GO.db                                           3.10.0   2020-03-18 [1]
##  gridExtra                                       2.3      2017-09-09 [1]
##  gtable                                          0.3.0    2019-03-25 [1]
##  gtools                                          3.8.2    2020-03-31 [1]
##  Gviz                                            1.30.3   2020-02-17 [1]
##  HDF5Array                                       1.14.4   2020-04-13 [1]
##  Hmisc                                           4.4-0    2020-03-23 [1]
##  hms                                             0.5.3    2020-01-08 [1]
##  htmlTable                                       1.13.3   2019-12-04 [1]
##  htmltools                                       0.4.0    2019-10-04 [1]
##  htmlwidgets                                     1.5.1    2019-10-08 [1]
##  httpuv                                          1.5.2    2019-09-11 [1]
##  httr                                            1.4.1    2019-08-05 [1]
##  IlluminaHumanMethylation450kanno.ilmn12.hg19  * 0.6.0    2020-03-18 [1]
##  IlluminaHumanMethylation450kmanifest          * 0.4.0    2020-03-18 [1]
##  IlluminaHumanMethylationEPICanno.ilm10b4.hg19   0.6.0    2020-03-18 [1]
##  IlluminaHumanMethylationEPICmanifest            0.3.0    2020-03-18 [1]
##  illuminaio                                    * 0.28.0   2019-10-29 [1]
##  interactiveDisplayBase                          1.24.0   2019-10-29 [1]
##  IRanges                                       * 2.20.2   2020-01-13 [1]
##  iterators                                     * 1.0.12   2019-07-26 [1]
##  jpeg                                            0.1-8.1  2019-10-24 [1]
##  jsonlite                                        1.6.1    2020-02-02 [1]
##  KernSmooth                                      2.23-17  2020-04-26 [1]
##  knitr                                           1.28     2020-02-06 [1]
##  labeling                                        0.3      2014-08-23 [1]
##  later                                           1.0.0    2019-10-04 [1]
##  lattice                                         0.20-41  2020-04-02 [1]
##  latticeExtra                                    0.6-29   2019-12-19 [1]
##  lazyeval                                        0.2.2    2019-03-15 [1]
##  lifecycle                                       0.2.0    2020-03-06 [1]
##  limma                                         * 3.42.2   2020-02-03 [1]
##  locfit                                        * 1.5-9.4  2020-03-25 [1]
##  lumi                                          * 2.38.0   2019-10-29 [1]
##  magrittr                                        1.5      2014-11-22 [1]
##  MASS                                            7.3-51.6 2020-04-26 [1]
##  Matrix                                          1.2-18   2019-11-27 [1]
##  matrixStats                                   * 0.56.0   2020-03-13 [1]
##  mclust                                          5.4.6    2020-04-11 [1]
##  memoise                                         1.1.0    2017-04-21 [1]
##  methylumi                                     * 2.32.0   2019-10-29 [1]
##  mgcv                                            1.8-31   2019-11-09 [1]
##  mime                                            0.9      2020-02-04 [1]
##  minfi                                         * 1.32.0   2019-10-29 [1]
##  missMethyl                                      1.20.4   2020-01-28 [1]
##  multtest                                        2.42.0   2019-10-29 [1]
##  munsell                                         0.5.0    2018-06-12 [1]
##  nleqslv                                         3.3.2    2018-05-17 [1]
##  nlme                                            3.1-147  2020-04-13 [1]
##  nnet                                            7.3-14   2020-04-26 [1]
##  nor1mix                                         1.3-0    2019-06-13 [1]
##  openssl                                         1.4.1    2019-07-18 [1]
##  org.Hs.eg.db                                  * 3.10.0   2020-03-18 [1]
##  permute                                         0.9-5    2019-03-12 [1]
##  pillar                                          1.4.3    2019-12-20 [1]
##  pkgbuild                                        1.0.7    2020-04-25 [1]
##  pkgconfig                                       2.0.3    2019-09-22 [1]
##  pkgload                                         1.0.2    2018-10-29 [1]
##  plyr                                            1.8.6    2020-03-03 [1]
##  png                                             0.1-7    2013-12-03 [1]
##  preprocessCore                                  1.48.0   2019-10-29 [1]
##  prettyunits                                     1.1.1    2020-01-24 [1]
##  processx                                        3.4.2    2020-02-09 [1]
##  progress                                        1.2.2    2019-05-16 [1]
##  promises                                        1.1.0    2019-10-04 [1]
##  ProtGenerics                                    1.18.0   2019-10-29 [1]
##  ps                                              1.3.2    2020-02-13 [1]
##  purrr                                           0.3.4    2020-04-17 [1]
##  quadprog                                        1.5-8    2019-11-20 [1]
##  quantro                                       * 1.20.0   2019-10-29 [1]
##  R.methodsS3                                     1.8.0    2020-02-14 [1]
##  R.oo                                            1.23.0   2019-11-03 [1]
##  R.utils                                         2.9.2    2019-12-08 [1]
##  R6                                              2.4.1    2019-11-12 [1]
##  randomForest                                    4.6-14   2018-03-25 [1]
##  rappdirs                                        0.3.1    2016-03-28 [1]
##  RColorBrewer                                    1.1-2    2014-12-07 [1]
##  Rcpp                                            1.0.4.6  2020-04-09 [1]
##  RCurl                                           1.98-1.2 2020-04-18 [1]
##  readr                                           1.3.1    2018-12-21 [1]
##  readxl                                          1.3.1    2019-03-13 [1]
##  remotes                                         2.1.1    2020-02-15 [1]
##  reshape                                         0.8.8    2018-10-23 [1]
##  reshape2                                      * 1.4.4    2020-04-09 [1]
##  rhdf5                                           2.30.1   2019-11-26 [1]
##  Rhdf5lib                                        1.8.0    2019-10-29 [1]
##  rlang                                           0.4.5    2020-03-01 [1]
##  rmarkdown                                       2.1      2020-01-20 [1]
##  rngtools                                        1.5      2020-01-23 [1]
##  ROC                                           * 1.62.0   2019-10-29 [1]
##  rpart                                           4.1-15   2019-04-12 [1]
##  RPMM                                          * 1.25     2017-02-28 [1]
##  rprojroot                                       1.3-2    2018-01-03 [1]
##  Rsamtools                                       2.2.3    2020-02-23 [1]
##  RSQLite                                         2.2.0    2020-01-07 [1]
##  rstudioapi                                      0.11     2020-02-07 [1]
##  rtracklayer                                     1.46.0   2019-10-29 [1]
##  ruv                                             0.9.7.1  2019-08-30 [1]
##  S4Vectors                                     * 0.24.4   2020-04-09 [1]
##  scales                                        * 1.1.0    2019-11-18 [1]
##  scrime                                          1.3.5    2018-12-01 [1]
##  sesame                                        * 1.4.0    2019-10-29 [1]
##  sesameData                                    * 1.4.0    2019-11-05 [1]
##  sessioninfo                                     1.1.1    2018-11-05 [1]
##  shiny                                           1.4.0.2  2020-03-13 [1]
##  siggenes                                        1.60.0   2019-10-29 [1]
##  sm                                            * 2.2-5.6  2018-09-27 [1]
##  statmod                                         1.4.34   2020-02-17 [1]
##  stringi                                         1.4.6    2020-02-17 [1]
##  stringr                                         1.4.0    2019-02-10 [1]
##  SummarizedExperiment                          * 1.16.1   2019-12-19 [1]
##  survival                                        3.1-12   2020-04-10 [1]
##  testthat                                        2.3.2    2020-03-02 [1]
##  tibble                                          3.0.1    2020-04-20 [1]
##  tidyr                                           1.0.2    2020-01-24 [1]
##  tidyselect                                      1.0.0    2020-01-27 [1]
##  TxDb.Hsapiens.UCSC.hg19.knownGene             * 3.2.2    2020-03-18 [1]
##  usethis                                         1.6.0    2020-04-09 [1]
##  VariantAnnotation                               1.32.0   2019-10-29 [1]
##  vctrs                                           0.2.4    2020-03-10 [1]
##  wateRmelon                                    * 1.30.0   2019-10-29 [1]
##  wheatmap                                        0.1.0    2018-03-15 [1]
##  withr                                           2.2.0    2020-04-20 [1]
##  xfun                                            0.13     2020-04-13 [1]
##  XML                                             3.99-0.3 2020-01-20 [1]
##  xml2                                            1.3.2    2020-04-23 [1]
##  xtable                                          1.8-4    2019-04-21 [1]
##  XVector                                       * 0.26.0   2019-10-29 [1]
##  yaml                                            2.2.1    2020-02-01 [1]
##  zlibbioc                                        1.32.0   2019-10-29 [1]
##  source        
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.2)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  CRAN (R 3.6.2)
##  CRAN (R 3.6.0)
##  Bioconductor  
##  CRAN (R 3.6.0)
##  Bioconductor  
## 
## [1] /Library/Frameworks/R.framework/Versions/3.6/Resources/library
LS0tCnRpdGxlOiAiR0FTUEFST05JIGRhdGFzZXQiCmF1dGhvcjogIkxhbnl1IFpoYW5nLCBUaWFnbyBDLiBTaWx2YSwgTGlseSBXYW5nIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWFya2Rvd246Omh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogbHVtZW4KICAgIGhpZ2hsaWdodDoga2F0ZQogICAgdG9jOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHllcwogICAgdG9jX2RlcHRoOiAzCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUgICAgCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIERhdGEgcmV0cml2YWwKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkobWluZmkpCmxpYnJhcnkoSWxsdW1pbmFIdW1hbk1ldGh5bGF0aW9uNDUwa21hbmlmZXN0KQpsaWJyYXJ5KElsbHVtaW5hSHVtYW5NZXRoeWxhdGlvbjQ1MGthbm5vLmlsbW4xMi5oZzE5KQpgYGAKCmBgYHtSfQpjb2hvcnQgPC0gIkdBU1BBUk9OSSIKZGF0YS5kaXIgPC0gZmlsZS5wYXRoKCIuLi9EQVRBU0VUUyIsY29ob3J0KSAKZGF0YS5kaXIudGFibGUgPC0gIi4uL0RBVEFTRVRTL1N1bW1hcnlfVGFibGUvIiAKZGF0YS5kaXIucmF3IDwtICIuLi8uLi9jb01ldGhETVJfbWV0YUFuYWx5c2lzL2NvZGVfdmFsaWRhdGlvbi9NZXRhX2FuYWx5c2lzX2NvZGUvREFUQVNFVFMvR0FTUEFST05JL3N0ZXAyX3JlYWRfbWluZmkvIgpkYXRhLmRpci5ic2ZpbHRlciA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXAyX2JzQ29udkZpbHRlci8iKSAKZGF0YS5kaXIuY2xpbmljYWwuZmlsdGVyIDwtIGZpbGUucGF0aChkYXRhLmRpciwic3RlcDNfY2xpbmljYWxfYXZhaWxhYmxlX2ZpbHRlcmluZy8iKSAKZGF0YS5kaXIucHJvYmVzLnFjIDwtIGZpbGUucGF0aChkYXRhLmRpciwic3RlcDRfcHJvYmVzUUNfZmlsdGVyaW5nLyIpIApkYXRhLmRpci5wcm9iZXMubm9ybWFsaXphdGlvbiA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXA1X25vcm1hbGl6YXRpb24vIikgCmRhdGEuZGlyLnBjYSA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXA2X3BjYV9maWx0ZXJpbmcvIikgCmRhdGEuZGlyLm5ldXJvbiA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXA3X25ldXJvbl9jb21wLyIpIApkYXRhLmRpci5zaW5nbGUuY3BnLnB2YWwgPC0gZmlsZS5wYXRoKGRhdGEuZGlyLCJzdGVwOF9zaW5nbGVfY3BnX3B2YWwvIikgCmRhdGEuZGlyLnJlc2lkdWFscyA8LSBmaWxlLnBhdGgoZGF0YS5kaXIsInN0ZXA5X3Jlc2lkdWFscy8iKSAKZGF0YS5kaXIubWVkaWFuIDwtIGZpbGUucGF0aChkYXRhLmRpciwic3RlcDEwX21lZGlhbi8iKSAKZm9yKHAgaW4gZ3JlcCgiZGlyIixscygpLHZhbHVlID0gVCkpIGRpci5jcmVhdGUoZ2V0KHApLHJlY3Vyc2l2ZSA9IFRSVUUsc2hvd1dhcm5pbmdzID0gRkFMU0UpCmBgYAoKIyBDb25maXJtIHNleCBzdGF0dXMgc2luZyBETkEgbWV0aHlsYXRpb24gdmFsdWVzCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFLCBldmFsPVRSVUV9CmxvYWQoZmlsZSA9IHBhc3RlMChkYXRhLmRpci5yYXcsICJHYXNwYXJvbmkucmRhIikpCmBgYAoKYGBge1J9CiMgQ3JlYXRlIGEgTWV0aHlsU2V0IG9iamVjdCBmcm9tIFJHU2V0Ck1TZXQgPC0gcHJlcHJvY2Vzc1JhdyhSR1NldCkKCiMgQ3JlYXRlIFtHZW5vbWljXU1ldGh5bFNldCBvYmplY3QKR01zZXQgPC0gbWFwVG9HZW5vbWUoTVNldCkKCiMgR2V0IHByZWRpY3RlZCBzZXggc3RhdHVzCmVzdFNleCA8LSBnZXRTZXgoR01zZXQpCgojIENvbXBhcmUgcHJlZGljdGVkIGdlbmRlciB3aXRoIHBoZW5vdHlwZSBnZW5kZXIKcmVhbFNleCA8LSBkYXRhLmZyYW1lKAogIHNhbXBsZSA9IHBhc3RlKHBoZW5vRGF0YSRnZW9fYWNjZXNzaW9uLAogICAgICAgICAgICAgICAgIHBoZW5vRGF0YSRzZW50cml4X2lkLmNoMSwKICAgICAgICAgICAgICAgICBwaGVub0RhdGEkc2VudHJpeF9wb3NpdGlvbi5jaDEsCiAgICAgICAgICAgICAgICAgc2VwID0gIl8iKSwKICByZWFsU2V4ID0gcGhlbm9EYXRhJFNleC5jaDEsCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCikKY29tcGFyZVNleCA8LSBtZXJnZSgKICBhcy5kYXRhLmZyYW1lKGVzdFNleCksIHJlYWxTZXgsCiAgYnkueCA9ICJyb3cubmFtZXMiLAogIGJ5LnkgPSAic2FtcGxlIikKCmlkZW50aWNhbChjb21wYXJlU2V4JHByZWRpY3RlZFNleCwgY29tcGFyZVNleCRyZWFsU2V4KQoKcHJpbnQoY29tcGFyZVNleCkKYGBgCgojIERhdGEgUUMgCgojIyBCaWxzdWZpdGUgY29udmVyc2lvbiBmaWx0ZXJpbmcKClJlbW92aW5nIHNhbXBsZXMgd2l0aCBiaXN1bGZpdGVDb252ZXJzaW9uIGxvd2VyIHRoYW4gODguCgpgYGB7UiBxY19zYW1wbGVzX3BhY2thZ2VzLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSJ9CmxpYnJhcnkod2F0ZVJtZWxvbikKbGlicmFyeShSUE1NKQojbGlicmFyeShzZXNhbWUpCiNsaWJyYXJ5KHNlc2FtZURhdGEpCmBgYAoKYGBge1IsIGluY2x1ZGUgPSBGQUxTRSwgZXZhbD1UUlVFfQpsb2FkKGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIucmF3LCAiR2FzcGFyb25pLnJkYSIpKQpgYGAKCmBgYHtSfQpwaGVub0RhdGEgPC0gcGhlbm9EYXRhW21hdGNoKHN1YnN0cihjb2xuYW1lcyhSR1NldCksMSwxMCksIHBoZW5vRGF0YSRnZW9fYWNjZXNzaW9uKSxdCm5iLnNhbXBsZXMgPC0gbnJvdyhwaGVub0RhdGEpCm5iLmZlbWFsZS5zYW1wbGVzIDwtIHN1bShwaGVub0RhdGEkU2V4LmNoMSA9PSAiRiIpCm5iLm1hbGUuc2FtcGxlcyA8LSBzdW0ocGhlbm9EYXRhJFNleC5jaDEgPT0gIk0iKQpgYGAKCmBgYHtSfQpicyA8LSBkYXRhLmZyYW1lKGJpc3VsZml0ZUNvbnZlcnNpb24gPSBic2NvbihSR1NldCkpCmJzRmlsdGVyZWRPdXQgPC0gcm93Lm5hbWVzKGJzKVticyRiaXN1bGZpdGVDb252ZXJzaW9uIDwgODhdClJHU2V0IDwtIFJHU2V0WywhY29sbmFtZXMoUkdTZXQpICVpbiUgYnNGaWx0ZXJlZE91dF0KcGhlbm9EYXRhIDwtIHBoZW5vRGF0YVttYXRjaChzdWJzdHIoY29sbmFtZXMoUkdTZXQpLDEsMTApLCBwaGVub0RhdGEkZ2VvX2FjY2Vzc2lvbiksXQoKbmIuc2FtcGxlcy5iYy5maWx0ZXJlZCA8LSBucm93KHBoZW5vRGF0YSkKbmIuZmVtYWxlLnNhbXBsZXMuYmMuZmlsdGVyZWQgPC0gc3VtKHBoZW5vRGF0YSRTZXguY2gxID09ICJGIikKbmIubWFsZS5zYW1wbGVzLmJjLmZpbHRlcmVkIDwtIHN1bShwaGVub0RhdGEkU2V4LmNoMSA9PSAiTSIpCmBgYAoKYGBge1IsIGluY2x1ZGUgPSBUUlVFLCBldmFsPVRSVUV9CmdncHVicjo6Z2doaXN0b2dyYW0oYnMkYmlzdWxmaXRlQ29udmVyc2lvbix4bGFiID0gImJpc3VsZml0ZSBDb252ZXJzaW9uIiApCmBgYAoKYGBge1IsIGV2YWwgPSBUUlVFfQpzYXZlKFJHU2V0LAogICAgIG5iLnNhbXBsZXMsCiAgICAgbmIuZmVtYWxlLnNhbXBsZXMsCiAgICAgbmIubWFsZS5zYW1wbGVzLAogICAgIGJzLAogICAgIHBoZW5vRGF0YSwKICAgICBuYi5zYW1wbGVzLmJjLmZpbHRlcmVkLAogICAgIG5iLmZlbWFsZS5zYW1wbGVzLmJjLmZpbHRlcmVkLAogICAgIG5iLm1hbGUuc2FtcGxlcy5iYy5maWx0ZXJlZCwKICAgICBmaWxlID0gcGFzdGUwKGRhdGEuZGlyLmJzZmlsdGVyLCAiL1JHU2V0X2JzZmlsdGVyZWQucmRhIikpCmBgYAoKIyMgQ2xpbmljYWwgZGF0YSBmaWx0ZXJpbmcKCmBgYHtSLCBpbmNsdWRlID0gRkFMU0UsIGV2YWwgPSBUUlVFfQpsb2FkKGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIuYnNmaWx0ZXIsICIvUkdTZXRfYnNmaWx0ZXJlZC5yZGEiKSkKYGBgCgpgYGB7Un0KcGhlbm9EYXRhJGJyYWFrX3N0YWdlLmNoMSA8LSBwaGVub0RhdGEkYnJhYWtfc3RhZ2UuY2gxICU+JSBhcy5udW1lcmljKCkKcGhlbm9EYXRhJGFnZS5jaDEgPC0gcGhlbm9EYXRhJGFnZS5jaDEgJT4lIGFzLm51bWVyaWMoKQojIyMgU3Vic2V0IHJvd3MgYW5kIGNvbHVtbnMKcGhlbm9fZGYgPC0gcGhlbm9EYXRhICAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JQogIGRwbHlyOjpmaWx0ZXIoCiAgICBzb3VyY2VfbmFtZV9jaDEgPT0gIkZyb250YWwgQ29ydGV4IiAmCiAgICAgICFpcy5uYShwaGVub0RhdGEkYnJhYWtfc3RhZ2UuY2gxKSAmCiAgICAgIHBoZW5vRGF0YSRjaGFyYWN0ZXJpc3RpY3NfY2gxID09ICJjZWxsIHR5cGU6IGJ1bGsiCiAgKSAlPiUgZHBseXI6OnNlbGVjdCgKICAgIGMoCiAgICAgICJnZW9fYWNjZXNzaW9uIiwKICAgICAgImRvbm9yX2lkLmNoMSIsCiAgICAgICJzZW50cml4X2lkLmNoMSIsCiAgICAgICJhZ2UuY2gxIiwKICAgICAgIlNleC5jaDEiLAogICAgICAiYnJhYWtfc3RhZ2UuY2gxIgogICAgKQogICkKCiMjIyBSZW5hbWUgdmFycwpjb2xuYW1lcyhwaGVub19kZikgPC0gYygKICAic2FtcGxlIiwgInN1YmplY3QuaWQiLCAic2xpZGUiLCAiYWdlLmJyYWluIiwgInNleCIsICJzdGFnZSIKKQpuYi5zYW1wbGVzLndpdGguY2xpbmljYWwgPC0gbnJvdyhwaGVub19kZikKbmIuZmVtYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCA8LSBzdW0ocGhlbm9fZGYkc2V4ID09ICJGIikKbmIubWFsZS5zYW1wbGVzLndpdGguY2xpbmljYWwgPC0gc3VtKHBoZW5vX2RmJHNleCA9PSAiTSIpCgojIyBwaGVub3R5cGUgZGF0YXNldApzYXZlKFJHU2V0LAogICAgIG5iLnNhbXBsZXMud2l0aC5jbGluaWNhbCwKICAgICBuYi5mZW1hbGUuc2FtcGxlcy53aXRoLmNsaW5pY2FsLAogICAgIG5iLm1hbGUuc2FtcGxlcy53aXRoLmNsaW5pY2FsLAogICAgIHBoZW5vX2RmLAogICAgIGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIuY2xpbmljYWwuZmlsdGVyLCAiL2dhc3Bhcm9uaV9ic19hbmRfY2xpbmljYWxfZmlsdGVyZWQucmRhIikpCmBgYAoKIyMgUHJvYmVzIFFDCgpJbnB1dDogCgotIFJHU2V0LlJEUwotIGJldGFfbWF0LlJEUwoKT3V0cHV0OiAKCi0gYmV0YV9DR19YWV9TTlBmaWx0ZXJlZC5SRFMKCmBgYHtSLCBpbmNsdWRlPUZBTFNFLCBldmFsPVRSVUV9CmxvYWQocGFzdGUwKGRhdGEuZGlyLmNsaW5pY2FsLmZpbHRlciwgIi9nYXNwYXJvbmlfYnNfYW5kX2NsaW5pY2FsX2ZpbHRlcmVkLnJkYSIpKQpgYGAKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CmxpYnJhcnkobWluZmkpCmxpYnJhcnkoRE1SY2F0ZSkKbGlicmFyeShzZXNhbWUpCmBgYAoKYGBge1J9CiMjIyBGaW5kIHdoaWNoIGNocm9tb3NvbWUgZWFjaCBwcm9iZSBpcyBvbgpiZXRhX21hdCA8LSBiZXRhX21hdCA8LSBnZXRCZXRhKFJHU2V0KQoKcHJvYmVzLmluZm8gPC0gc2VzYW1lRGF0YUdldCgiSE00NTAuaGcxOS5tYW5pZmVzdCIpCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Jvdy5uYW1lcyhiZXRhX21hdCkgJT4lIGFzLmNoYXJhY3RlcigpXSAlPiUKICBhcy5kYXRhLmZyYW1lICU+JQogIGRwbHlyOjpzZWxlY3QoYygic2VxbmFtZXMiLCJzdGFydCIsImVuZCIpKQpwcm9iZXMuaW5mbyRzZXFuYW1lcyA8LSBhcy5jaGFyYWN0ZXIocHJvYmVzLmluZm8kc2VxbmFtZXMpCgpuYi5wcm9iZXMgPC0gbnJvdyhwcm9iZXMuaW5mbykKbmIuY2hyQXV0by5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzICVpbiUgcGFzdGUwKCJjaHIiLCAxOjIyKSkKbmIuY2hyWC5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJYIikKbmIuY2hyWS5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJZIikKbmIuY2hyTS5wcm9iZXMgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJNIikKYGBgCgpgYGB7Un0KIyMjIHN1YnNldCB0byBwcm9iZXMgd2l0aCBkZXRlY3Rpb24gUCA8PSAwLjAxCmRldFAgPC0gZGV0ZWN0aW9uUChSR1NldCwgdHlwZSA9ICJtK3UiKQpmYWlsZWQuMDEgPC0gZGV0UCA+IDAuMDEKcGFzc2VkUHJvYmVzIDwtIHJvd25hbWVzKGZhaWxlZC4wMSlbcm93TWVhbnMoZmFpbGVkLjAxKSA9PSAwXSAKYmV0YV9tYXQgPC0gYmV0YV9tYXRbcGFzc2VkUHJvYmVzLCBdCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Jvdy5uYW1lcyhwcm9iZXMuaW5mbykgJWluJSByb3cubmFtZXMoYmV0YV9tYXQpLF0KCm5iLnByb2Jlcy5kZXRlY3RQIDwtIG5yb3cocHJvYmVzLmluZm8pCm5iLmNockF1dG8ucHJvYmVzLmRldGVjdFAgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzICVpbiUgcGFzdGUwKCJjaHIiLCAxOjIyKSkKbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UCA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gImNoclgiKQpuYi5jaHJZLnByb2Jlcy5kZXRlY3RQIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWSIpCm5iLmNock0ucHJvYmVzLmRldGVjdFAgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJNIikKCiMjIyBrZWVwIG9ubHkgcHJvYmVzIHRoYXQgc3RhcnQgd2l0aCAiY2ciCmJldGFfbWF0IDwtIGJldGFfbWF0W2dyZXAoImNnIixyb3duYW1lcyhiZXRhX21hdCkpLF0KcHJvYmVzLmluZm8gPC0gcHJvYmVzLmluZm9bcm93Lm5hbWVzKHByb2Jlcy5pbmZvKSAlaW4lIHJvdy5uYW1lcyhiZXRhX21hdCksXQoKbmIucHJvYmVzLmRldGVjdFAuY2cgPC0gbnJvdyhwcm9iZXMuaW5mbykKbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UC5jZyA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgJWluJSBwYXN0ZTAoImNociIsIDE6MjIpKQpuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLmNnIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWCIpCm5iLmNoclkucHJvYmVzLmRldGVjdFAuY2cgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJZIikKbmIuY2hyTS5wcm9iZXMuZGV0ZWN0UC5jZyA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gImNock0iKQpgYGAKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyMjIGRyb3AgcHJvYmVzIHdoZXJlIFNOUCB3aXRoIE1BRiA+PSAwLjAxIGluIHRoZSBsYXN0IDUgYnAgb2YgdGhlIHByb2JlCmJldGFfbWF0IDwtIHJtU05QYW5kQ0goCiAgb2JqZWN0ID0gYmV0YV9tYXQsCiAgZGlzdCA9IDUsIAogIG1hZmN1dCA9IDAuMDEsIAogIGFuZCA9IFRSVUUsCiAgcm1jcm9zc2h5YiA9IEZBTFNFLAogIHJtWFkgPSBGQUxTRQopCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Jvdy5uYW1lcyhwcm9iZXMuaW5mbykgJWluJSByb3cubmFtZXMoYmV0YV9tYXQpLF0KCm5iLnByb2Jlcy5jZy5kbXJjYXRlIDwtIG5yb3cocHJvYmVzLmluZm8pCm5iLmNockF1dG8ucHJvYmVzLmNnLmRtcmNhdGUgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzICVpbiUgcGFzdGUwKCJjaHIiLCAxOjIyKSkKbmIuY2hyWC5wcm9iZXMuY2cuZG1yY2F0ZSA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gImNoclgiKQpuYi5jaHJZLnByb2Jlcy5jZy5kbXJjYXRlIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWSIpCm5iLmNock0ucHJvYmVzLmNnLmRtcmNhdGUgPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJNIikKCiMjIyBkcm9wIHByb2JlcyBpbiBjaHJNCnByb2Jlcy5pbmZvIDwtIHByb2Jlcy5pbmZvW3Byb2Jlcy5pbmZvJHNlcW5hbWVzICE9ICJjaHJNIixdCmJldGFfbWF0IDwtIGJldGFfbWF0WwogIHJvdy5uYW1lcyhiZXRhX21hdCkgJWluJSByb3cubmFtZXMocHJvYmVzLmluZm8pLApdCgpuYi5wcm9iZXMuZG1yY2F0ZS5jaHJNIDwtIG5yb3cocHJvYmVzLmluZm8pCm5iLmNockF1dG8ucHJvYmVzLmRtcmNhdGUuY2hyTSA8LSBzdW0ocHJvYmVzLmluZm8kc2VxbmFtZXMgJWluJSBwYXN0ZTAoImNociIsIDE6MjIpKQpuYi5jaHJYLnByb2Jlcy5kbXJjYXRlLmNock0gPC0gc3VtKHByb2Jlcy5pbmZvJHNlcW5hbWVzID09ICJjaHJYIikKbmIuY2hyWS5wcm9iZXMuZG1yY2F0ZS5jaHJNIDwtIHN1bShwcm9iZXMuaW5mbyRzZXFuYW1lcyA9PSAiY2hyWSIpCgpzYXZlKAogIHBoZW5vX2RmLAogIGJldGFfbWF0LAogIG5iLnByb2Jlcy5kZXRlY3RQLAogIG5iLmNockF1dG8ucHJvYmVzLmRldGVjdFAsCiAgbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UCwKICBuYi5jaHJZLnByb2Jlcy5kZXRlY3RQLAogIG5iLmNock0ucHJvYmVzLmRldGVjdFAsCiAgbmIucHJvYmVzLmRldGVjdFAuY2csCiAgbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UC5jZywKICBuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLmNnLAogIG5iLmNoclkucHJvYmVzLmRldGVjdFAuY2csCiAgbmIuY2hyTS5wcm9iZXMuZGV0ZWN0UC5jZywKICBuYi5wcm9iZXMuY2cuZG1yY2F0ZSwKICBuYi5jaHJBdXRvLnByb2Jlcy5jZy5kbXJjYXRlLAogIG5iLmNoclgucHJvYmVzLmNnLmRtcmNhdGUsCiAgbmIuY2hyWS5wcm9iZXMuY2cuZG1yY2F0ZSwKICBuYi5jaHJNLnByb2Jlcy5jZy5kbXJjYXRlLAogIG5iLnByb2Jlcy5kbXJjYXRlLmNock0sCiAgbmIuY2hyQXV0by5wcm9iZXMuZG1yY2F0ZS5jaHJNLAogIG5iLmNoclgucHJvYmVzLmRtcmNhdGUuY2hyTSwKICBuYi5jaHJZLnByb2Jlcy5kbXJjYXRlLmNock0sCiAgZmlsZSA9IHBhc3RlMChkYXRhLmRpci5wcm9iZXMucWMsICIvYmV0YV9DR19YWV9TTlBmaWx0ZXJlZF9tYXQucmRhIikKKQpgYGAKCiMgTm9ybWFsaXphdGlvbgoKLSBRdWFudGlsZSBub3JtYWxpemF0aW9uIGFuZCBCTUlRIG5vcm1hbGl6YXRpb24KCklucHV0OiAKCi0gYmV0YV9DR19YWV9TTlBmaWx0ZXJlZF9tYXQuUkRTCi0gUkdTZXQuUkRTCi0gcGhlbm9fZGYuUkRTCi0gZnVsbC5hbm5vdC5SRFMKCk91dHB1dDogCgotIGJzLmNzdgotIHBoZW5vX2RmLlJEUwotIFFOQk1JUS5SRFMKCmBgYHtSIHFjU2FtcGxlc0RhdGEsIGluY2x1ZGUgPSBGQUxTRSwgZXZhbD1UUlVFfQpsb2FkKHBhc3RlMChkYXRhLmRpci5wcm9iZXMucWMsICIvYmV0YV9DR19YWV9TTlBmaWx0ZXJlZF9tYXQucmRhIikpCmBgYAoKCiMjIFF1YW50aWxlIG5vcm1hbGl6YXRpb24KCiMjIyBDaGVjayBpZiBzZXggY2hyb20gaGF2ZSBoaWdoZXIvbG93ZXIgaW50ZW5zaXRpZXMgdGhhbiBhdXRvc29tZXMKCiMjIyMgQ3JlYXRlIGZ1bmN0aW9uIHRvIGV4dHJhY3Qgc2VwYXJhdGUgbWF0cml4IGZvciBlYWNoIGNocm9tb3NvbWUKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CmxpYnJhcnkoc2VzYW1lKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKYGBge1J9CnByb2Jlcy5pbmZvIDwtIHNlc2FtZURhdGFHZXQoIkhNNDUwLmhnMTkubWFuaWZlc3QiKQpwcm9iZXMuaW5mbyA8LSBwcm9iZXMuaW5mb1tyb3cubmFtZXMoYmV0YV9tYXQpICU+JSBhcy5jaGFyYWN0ZXIoKV0gJT4lCiAgYXMuZGF0YS5mcmFtZSAlPiUKICBkcGx5cjo6c2VsZWN0KGMoInNlcW5hbWVzIiwic3RhcnQiLCJlbmQiKSkKcHJvYmVzLmluZm8kc2VxbmFtZXMgPC0gYXMuY2hhcmFjdGVyKHByb2Jlcy5pbmZvJHNlcW5hbWVzKQoKZmluZEJldGFDaHIgPC0gZnVuY3Rpb24oZGF0YSwgY2hyb20pewogIGRhdGEgJT4lCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lICMgaGFzIHRvIHR1cm4gbWF0cml4IGludG8gZGYgZm9yIG5leHQgc3RlcAogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oKSAlPiUgIyB0dXJuIHJvd25hbWVzIHRvIGEgY29sdW1uLCBzbyByb3duYW1lcyB3b24ndCBiZSBkZWxldGVkIGFmdGVyIGZpbHRlcmluZyByb3dzIGluIG5leHQgc3RlcAogICAgZmlsdGVyKHJvd25hbWUgJWluJSByb3cubmFtZXMocHJvYmVzLmluZm9bcHJvYmVzLmluZm8kc2VxbmFtZXMgPT0gY2hyb20sXSkpICU+JQogICAgdGliYmxlOjpjb2x1bW5fdG9fcm93bmFtZXMoKSAlPiUKICAgIGFzLm1hdHJpeCgpCn0KYGBgCgojIyMjIENvbXBhcmUgYmV0YSB2YWx1ZXMgYmV0d2VlbiBnZW5kZXIKCiMjIyMjIG9uIGNoclgKCmBgYHtSfQpiZXRhQ2hyWCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXQsIGNocm9tID0gImNoclgiKQpiZXRhQ2hyWF9sb25nIDwtIGRhdGEuZnJhbWUoCiAgYmV0YSA9IGFzLnZlY3RvcihiZXRhQ2hyWCksCiAgc2FtcGxlID0gcmVwKHN1YnN0cihjb2xuYW1lcyhiZXRhQ2hyWCksIDEsMTApLCBlYWNoID0gbnJvdyhiZXRhQ2hyWCkpLAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQopCmJldGFDaHJYX2xvbmcgPC0gbWVyZ2UoCiAgYmV0YUNoclhfbG9uZywgcGhlbm9fZGZbLCBjKCJzYW1wbGUiLCAic2V4IildLAogIGJ5ID0gInNhbXBsZSIsCiAgc29ydCA9IEZBTFNFCikKICAKZ2dwbG90KGJldGFDaHJYX2xvbmcsCiAgICAgICBhZXMoeCA9IHNhbXBsZSwgeSA9IGJldGEsIGZpbGwgPSBzZXgpKSArCiAgc3RhdF9ib3hwbG90KGdlb20gPSdlcnJvcmJhcicsIHdpZHRoID0gMSwgbGluZXR5cGUgPSAxKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMSwgYWxwaGEgPSAxLCBvdXRsaWVyLnNoYXBlID0gMSwgb3V0bGllci5zaXplID0gMikgKwogIHNjYWxlX2ZpbGxfZ3JleShzdGFydD0xLCBlbmQ9MC42KSArCiAgbGFicyh4ID0gInNleCIsIHkgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICAgICAgIHRpdGxlID0gIkROQSBtZXRoeWxhdGlvbiBsZXZlbCBieSBzZXggb24gY2hyb21vc29tZSBYIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF93cmFwKH5zZXgpCmBgYAoKIyMjIyMgb24gY2hyWQoKYGBge1J9CmJldGFDaHJZIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdCwgY2hyb20gPSAiY2hyWSIpCmJldGFDaHJZX2xvbmcgPC0gZGF0YS5mcmFtZSgKICBiZXRhID0gYXMudmVjdG9yKGJldGFDaHJZKSwKICBzYW1wbGUgPSByZXAoc3Vic3RyKGNvbG5hbWVzKGJldGFDaHJZKSwgMSwxMCksIGVhY2ggPSBucm93KGJldGFDaHJZKSksCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCikKYmV0YUNocllfbG9uZyA8LSBtZXJnZSgKICBiZXRhQ2hyWV9sb25nLCBwaGVub19kZlssIGMoInNhbXBsZSIsICJzZXgiKV0sCiAgYnkgPSAic2FtcGxlIiwKICBzb3J0ID0gRkFMU0UKKQoKZ2dwbG90KGJldGFDaHJZX2xvbmcsCiAgICAgICBhZXMoeCA9IHNhbXBsZSwgeSA9IGJldGEsIGZpbGwgPSBzZXgpKSArCiAgc3RhdF9ib3hwbG90KGdlb20gPSdlcnJvcmJhcicsIHdpZHRoID0gMSwgbGluZXR5cGUgPSAxKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMSwgYWxwaGEgPSAxLCBvdXRsaWVyLnNoYXBlID0gMSwgb3V0bGllci5zaXplID0gMikgKwogIHNjYWxlX2ZpbGxfZ3JleShzdGFydD0xLCBlbmQ9MC42KSArCiAgbGFicyh4ID0gInNleCIsIHkgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICAgICAgIHRpdGxlID0gIkROQSBtZXRoeWxhdGlvbiBsZXZlbCBieSBzZXggb24gY2hyb21vc29tZSBZIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsKICBmYWNldF93cmFwKH5zZXgpCmBgYAoKIyMjIyBCb3hwbG90IG9mIG1ldGh5bGF0aW9uIGJ5IGNocm9tb3NvbWVzICAKCiMjIyMjIG92ZXJhbGwgIAoKYGBge1J9CmNockF1dG8gPC0gcGFzdGUwKCJjaHIiLCAxOjIyKQpiZXRhQ2hyQXV0b19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGNockF1dG8pLCBmdW5jdGlvbihpKXsKICBkYXQgPC0gZmluZEJldGFDaHIoZGF0YSA9IGJldGFfbWF0LCBjaHJvbSA9IGNockF1dG9baV0pCiAgZGF0YS5mcmFtZShiZXRhID0gYXMudmVjdG9yKGRhdCksIGNocm9tID0gImF1dG9zb21lcyIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKfSkKYmV0YUNockF1dG9fZGYgPC0gZG8uY2FsbChyYmluZCwgYmV0YUNockF1dG9fbHMpCgpjaHJTZXggPC0gcGFzdGUwKCJjaHIiLCBjKCJYIiwgIlkiKSkKYmV0YUNoclNleF9scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGNoclNleCksIGZ1bmN0aW9uKGkpewogIGRhdCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXQsIGNocm9tID0gY2hyU2V4W2ldKQogIGRhdGEuZnJhbWUoYmV0YSA9IGFzLnZlY3RvcihkYXQpLCBjaHJvbSA9IGNoclNleFtpXSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQp9KQpiZXRhQ2hyU2V4X2RmIDwtIGRvLmNhbGwocmJpbmQsIGJldGFDaHJTZXhfbHMpCgpiZXRhQ2hyX2RmIDwtIHJiaW5kKGJldGFDaHJBdXRvX2RmLCBiZXRhQ2hyU2V4X2RmKQoKIyAjIE5vIGVub3VnaCBtZW1vcnkgdG8gbG9hZCBhbGwgdGhlIGRhdGEgcG9pbnRzIGFuZCBwbG90IHRoZSBmaWd1cmUsIHNvIHVzZSBmdW5jdGlvbiBib3hwbG90IGluc3RlYWQKIyBnZ3Bsb3QoYmV0YUNocl9kZiwKIyAgICAgICAgYWVzKHggPSBjaHJvbSwgeSA9IGJldGEsIGZpbGwgPSBjaHJvbSkpICsKIyAgIHN0YXRfYm94cGxvdChnZW9tID0nZXJyb3JiYXInLCB3aWR0aCA9IDAuNCwgbGluZXR5cGUgPSAxKSArCiMgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjQsIGFscGhhID0gMSwgb3V0bGllci5zaGFwZSA9IDEsIG91dGxpZXIuc2l6ZSA9IDIpICsKIyAgIHNjYWxlX2ZpbGxfZ3JleShzdGFydD0xLCBlbmQ9MC42KSArCiMgICBsYWJzKHggPSAiY2hyb21vc29tZSB0eXBlIiwgeSA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAojICAgICAgICB0aXRsZSA9ICJETkEgbWV0aHlsYXRpb24gbGV2ZWwgdnMuIGNocm9tb3NvbWUgdHlwZSIpICsKIyAgIHRoZW1lX2J3KCkKCmJveHBsb3QoCiAgYmV0YSB+IGNocm9tLCBkYXRhID0gYmV0YUNocl9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIikKCnBkZihmaWxlID0gcGFzdGUwKGRhdGEuZGlyLnByb2Jlcy5ub3JtYWxpemF0aW9uLCAiL2JldGFfdnNfY2hyb20ucGRmIikpCmJveHBsb3QoCiAgYmV0YSB+IGNocm9tLCBkYXRhID0gYmV0YUNocl9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIikKZGV2Lm9mZigpCmBgYAoKIyMjIyMgYnkgZ2VuZGVyICAKCmBgYHtSfQojIyMgc3BsaXQgbWF0cml4IGJ5IHNleCBmaXJzdApiZXRhX21hdF9mZW1hbGUgPC0gYmV0YV9tYXRbIAogICxzdWJzdHIoY29sbmFtZXMoYmV0YV9tYXQpLCAxLCAxMCkgJWluJSBwaGVub19kZiRzYW1wbGVbcGhlbm9fZGYkc2V4ID09ICJGIl1dCmJldGFfbWF0X21hbGUgPC0gYmV0YV9tYXRbIAogICxzdWJzdHIoY29sbmFtZXMoYmV0YV9tYXQpLCAxLCAxMCkgJWluJSBwaGVub19kZiRzYW1wbGVbcGhlbm9fZGYkc2V4ID09ICJNIl1dCgojIyMgZm9yIGZlbWFsZXMKY2hyQXV0byA8LSBwYXN0ZTAoImNociIsIDE6MjIpCmZlbWFsZV9hdXRvX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoY2hyQXV0byksIGZ1bmN0aW9uKGkpewogIGRhdCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfZmVtYWxlLCBjaHJvbSA9IGNockF1dG9baV0pCiAgZGF0YS5mcmFtZShiZXRhID0gYXMudmVjdG9yKGRhdCksIGNocm9tID0gImF1dG9zb21lcyIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKfSkKZmVtYWxlX2F1dG9fZGYgPC0gZG8uY2FsbChyYmluZCwgZmVtYWxlX2F1dG9fbHMpCgpmZW1hbGVfc2V4X2RmIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9mZW1hbGUsIGNocm9tID0gImNoclgiKQpmZW1hbGVfc2V4X2RmIDwtIGRhdGEuZnJhbWUoYmV0YSA9IGFzLnZlY3RvcihmZW1hbGVfc2V4X2RmKSwgY2hyb20gPSAiY2hyb21vc29tZSBYIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKZmVtYWxlX2RmIDwtIHJiaW5kKGZlbWFsZV9hdXRvX2RmLCBmZW1hbGVfc2V4X2RmKQoKYm94cGxvdCgKICBiZXRhIH4gY2hyb20sIGRhdGEgPSBmZW1hbGVfZGYsIHlsYWIgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICBtYWluID0gIkROQSBtZXRoeWxhdGlvbiBvbiBjaHJvbW9zb21lcyBmb3IgZmVtYWxlcyIpCgojIyMgZm9yIG1hbGVzCmNockF1dG8gPC0gcGFzdGUwKCJjaHIiLCAxOjIyKQptYWxlX2F1dG9fbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhjaHJBdXRvKSwgZnVuY3Rpb24oaSl7CiAgZGF0IDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9tYWxlLCBjaHJvbSA9IGNockF1dG9baV0pCiAgZGF0YS5mcmFtZShiZXRhID0gYXMudmVjdG9yKGRhdCksIGNocm9tID0gImF1dG9zb21lcyIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKfSkKbWFsZV9hdXRvX2RmIDwtIGRvLmNhbGwocmJpbmQsIG1hbGVfYXV0b19scykKCm1hbGVfWF9kZiA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfbWFsZSwgY2hyb20gPSAiY2hyWCIpCm1hbGVfWF9kZiA8LSBkYXRhLmZyYW1lKGJldGEgPSBhcy52ZWN0b3IobWFsZV9YX2RmKSwgY2hyb20gPSAiY2hyb21vc29tZSBYIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKbWFsZV9ZX2RmIDwtIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9tYWxlLCBjaHJvbSA9ICJjaHJZIikKbWFsZV9ZX2RmIDwtIGRhdGEuZnJhbWUoYmV0YSA9IGFzLnZlY3RvcihtYWxlX1lfZGYpLCBjaHJvbSA9ICJjaHJvbW9zb21lIFkiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgptYWxlX2RmIDwtIHJiaW5kKG1hbGVfYXV0b19kZiwgbWFsZV9YX2RmLCBtYWxlX1lfZGYpCgpib3hwbG90KAogIGJldGEgfiBjaHJvbSwgZGF0YSA9IG1hbGVfZGYsIHlsYWIgPSAiRE5BIG1ldGh5bGF0aW9uIGJldGEgdmFsdWVzIiwKICBtYWluID0gIkROQSBtZXRoeWxhdGlvbiBvbiBjaHJvbW9zb21lcyBmb3IgbWFsZXMiKQoKIyMjIHNhdmUgcGxvdHMKcGRmKGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24sICIvYmV0YV92c19jaHJvbV9ieV9nZW5kZXIucGRmIikpCgpib3hwbG90KAogIGJldGEgfiBjaHJvbSwgZGF0YSA9IGZlbWFsZV9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIGZvciBmZW1hbGVzIikKCmJveHBsb3QoCiAgYmV0YSB+IGNocm9tLCBkYXRhID0gbWFsZV9kZiwgeWxhYiA9ICJETkEgbWV0aHlsYXRpb24gYmV0YSB2YWx1ZXMiLAogIG1haW4gPSAiRE5BIG1ldGh5bGF0aW9uIG9uIGNocm9tb3NvbWVzIGZvciBtYWxlcyIpCgpkZXYub2ZmKCkKYGBgCgojIyMjIEJveHBsb3Qgb2YgbWV0aHlsYXRpb24gYnkgZ2VuZGVyIG9uIGF1dG9zb21lcywgWCwgWQoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cyA9ICdoaWRlJ30KbGlicmFyeShxdWFudHJvKQpgYGAKCiMjIyMjIG9uIGF1dG9zb21lcwoKYGBge1J9CmNockF1dG8gPC0gcGFzdGUwKCJjaHIiLCAxOjIyKQpiZXRhQ2hyQXV0b19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGNockF1dG8pLCBmdW5jdGlvbihpKXtmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXQsIGNocm9tID0gY2hyQXV0b1tpXSl9KQpiZXRhQ2hyQXV0b19kZiA8LSBkby5jYWxsKHJiaW5kLCBiZXRhQ2hyQXV0b19scykKbWF0Ym94cGxvdChiZXRhQ2hyQXV0b19kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGF1dG9zb21lcykgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQpgYGAKCiMjIyMjIG9uIGNoclggCgpgYGB7Un0KYmV0YUNoclhfZGYgPC0gZmluZEJldGFDaHIoZGF0YSA9IGJldGFfbWF0LCBjaHJvbSA9ICJjaHJYIikKbWF0Ym94cGxvdChiZXRhQ2hyWF9kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGNocm9tb3NvbWUgWCkgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQpgYGAKCiMjIyMjIG9uIGNoclkKCmBgYHtSfQpiZXRhQ2hyWV9kZiA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXQsY2hyb20gPSAiY2hyWSIpCm1hdGJveHBsb3QoYmV0YUNocllfZGYsCiAgICAgICAgICAgZ3JvdXBGYWN0b3IgPSBwaGVub19kZiRzZXgsCiAgICAgICAgICAgeGF4dCA9ICJuIiwKICAgICAgICAgICBtYWluID0gIkJldGEgVmFsdWVzIChjaHJvbW9zb21lIFkpIC0gYmVmb3JlIG5vcm1hbGl6YXRpb24iKQpsZWdlbmQoJ2JvdHRvbScsCiAgICAgICBwYXN0ZTAoInNleCAiLCBsZXZlbHMoYXMuZmFjdG9yKHBoZW5vX2RmJHNleCkpKSwKICAgICAgIGNvbCA9IGMoMTo3KSwgbHR5ID0gMSwgbHdkID0gMywgY2V4ID0gMC43MCkKYGBgCgojIyMjIyBzYXZlIHBsb3RzCgpgYGB7Un0KcGRmICgKICBwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24sICIvYm94UGxvdEJlZm9yZU5vcm1hbGl6YXRpb24ucGRmIikKKQoKbWF0Ym94cGxvdChiZXRhQ2hyQXV0b19kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGF1dG9zb21lcykgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKbWF0Ym94cGxvdChiZXRhQ2hyWF9kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGNocm9tb3NvbWUgWCkgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKbWF0Ym94cGxvdChiZXRhQ2hyWV9kZiwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGNocm9tb3NvbWUgWSkgLSBiZWZvcmUgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKZGV2Lm9mZigpCmBgYAoKIyMjIG5vcm1hbGl6YXRpb24gYnkgZ3JvdXAKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CmxpYnJhcnkobHVtaSkKYGBgCgojIyMjIHNwbGl0IGJldGFfbWF0IGludG8gc3ViLW1hdHJpY3MgYnkgZmVtYWxlcyBhdXRvc29tZXMsIGZlbWFsZXMgWCwgbWFsZXMgYXV0b3NvbWVzLCBtYWxlcyBYLCBtYWxlcyBZCgpgYGB7Un0KIyMjIHNwbGl0IG1hdHJpeCBieSBzZXggZmlyc3QKYmV0YV9tYXRfZmVtYWxlIDwtIGJldGFfbWF0WyAKICAsc3Vic3RyKGNvbG5hbWVzKGJldGFfbWF0KSwgMSwgMTApICVpbiUgcGhlbm9fZGYkc2FtcGxlW3BoZW5vX2RmJHNleCA9PSAiRiJdXQpiZXRhX21hdF9tYWxlIDwtIGJldGFfbWF0WyAKICAsc3Vic3RyKGNvbG5hbWVzKGJldGFfbWF0KSwgMSwgMTApICVpbiUgcGhlbm9fZGYkc2FtcGxlW3BoZW5vX2RmJHNleCA9PSAiTSJdXQoKIyMjIHNwbGl0IGZlbWFsZSBiZXRhIG1hdHJpeCBieSBjaHJvbW9zb21lIChhdXRvLCBYKQpjaHJBdXRvIDwtIHBhc3RlMCgiY2hyIiwgMToyMikKYmV0YV9tYXRfZmVtYWxlX2F1dG9fbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhjaHJBdXRvKSwgZnVuY3Rpb24oaSl7CiAgZmluZEJldGFDaHIoZGF0YSA9IGJldGFfbWF0X2ZlbWFsZSwgY2hyb20gPSBjaHJBdXRvW2ldKX0pCmJldGFfbWF0X2ZlbWFsZV9hdXRvIDwtIGRvLmNhbGwocmJpbmQsIGJldGFfbWF0X2ZlbWFsZV9hdXRvX2xzKQoKYmV0YV9tYXRfZmVtYWxlX1ggPC0gZmluZEJldGFDaHIoZGF0YSA9IGJldGFfbWF0X2ZlbWFsZSwgY2hyb20gPSAiY2hyWCIpCgojIyMgc3BsaXQgbWFsZSBiZXRhIG1hdHJpeCBieSBjaHJvbW9zb21lIChhdXRvLCBYLCBZKQpjaHJBdXRvIDwtIHBhc3RlMCgiY2hyIiwgMToyMikKYmV0YV9tYXRfbWFsZV9hdXRvX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoY2hyQXV0byksIGZ1bmN0aW9uKGkpewogIGZpbmRCZXRhQ2hyKGRhdGEgPSBiZXRhX21hdF9tYWxlLCBjaHJvbSA9IGNockF1dG9baV0pfSkKYmV0YV9tYXRfbWFsZV9hdXRvIDwtIGRvLmNhbGwocmJpbmQsIGJldGFfbWF0X21hbGVfYXV0b19scykKCmJldGFfbWF0X21hbGVfWCA8LSBmaW5kQmV0YUNocihkYXRhID0gYmV0YV9tYXRfbWFsZSwgY2hyb20gPSAiY2hyWCIpCgpiZXRhX21hdF9tYWxlX1kgPC0gZmluZEJldGFDaHIoZGF0YSA9IGJldGFfbWF0X21hbGUsIGNocm9tID0gImNoclkiKQpgYGAKCiMjIyMgbm9ybWFsaXphdGlvbiAKCmBgYHtSfQojIyMgZmVtYWxlIGF1dG9zb21lcwpiZXRhUU5fZmVtYWxlX2F1dG8gPC0gbHVtaU4oeC5sdW1pID0gYmV0YV9tYXRfZmVtYWxlX2F1dG8sIG1ldGhvZCA9ICJxdWFudGlsZSIpCmRpbShiZXRhUU5fZmVtYWxlX2F1dG8pCgojIyMgZmVtYWxlIGNocm9tb3NvbWUgWApiZXRhUU5fZmVtYWxlX1ggPC0gbHVtaU4oeC5sdW1pID0gYmV0YV9tYXRfZmVtYWxlX1gsIG1ldGhvZCA9ICJxdWFudGlsZSIpCmRpbShiZXRhUU5fZmVtYWxlX1gpCgojIyMgbWFsZSBhdXRvc29tZXMKYmV0YVFOX21hbGVfYXV0byA8LSBsdW1pTih4Lmx1bWkgPSBiZXRhX21hdF9tYWxlX2F1dG8sIG1ldGhvZCA9ICJxdWFudGlsZSIpCmRpbShiZXRhUU5fbWFsZV9hdXRvKQoKIyMjIG1hbGUgY2hyb21vc29tZSBYCmJldGFRTl9tYWxlX1ggPC0gbHVtaU4oeC5sdW1pID0gYmV0YV9tYXRfbWFsZV9YLCBtZXRob2QgPSAicXVhbnRpbGUiKQpkaW0oYmV0YVFOX21hbGVfWCkKCiMjIyBtYWxlIGNocm9tb3NvbWUgWQpiZXRhUU5fbWFsZV9ZIDwtIGx1bWlOKHgubHVtaSA9IGJldGFfbWF0X21hbGVfWSwgbWV0aG9kID0gInF1YW50aWxlIikKZGltKGJldGFRTl9tYWxlX1kpCmBgYAoKIyMjIyMgRmVtYWxlIHBsb3RzIGFmdGVyIG5vcm1hbGl6YXRpb24gCgpgYGB7Un0KcGhlbm9fZmVtYWxlX2RmIDwtIHBoZW5vX2RmICU+JSBmaWx0ZXIoc2V4ID09ICJNIikKbWF0Ym94cGxvdChiZXRhUU5fZmVtYWxlX2F1dG8sCiAgICAgICAgICAgZ3JvdXBGYWN0b3IgPSBwaGVub19mZW1hbGVfZGYkc2V4LAogICAgICAgICAgIHhheHQgPSAibiIsCiAgICAgICAgICAgbWFpbiA9ICJCZXRhIFZhbHVlcyAoYXV0b3NvbWVzKSAtIGFmdGVyIG5vcm1hbGl6YXRpb24iKQpsZWdlbmQoJ2JvdHRvbScsCiAgICAgICBwYXN0ZTAoInNleCAiLCBsZXZlbHMoYXMuZmFjdG9yKHBoZW5vX2ZlbWFsZV9kZiRzZXgpKSksCiAgICAgICBjb2wgPSBjKDE6NyksIGx0eSA9IDEsIGx3ZCA9IDMsIGNleCA9IDAuNzApCgptYXRib3hwbG90KGJldGFRTl9mZW1hbGVfWCwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX2ZlbWFsZV9kZiRzZXgsCiAgICAgICAgICAgeGF4dCA9ICJuIiwKICAgICAgICAgICBtYWluID0gIkJldGEgVmFsdWVzIChjaHJvbW9zb21lIFgpIC0gYWZ0ZXIgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fZmVtYWxlX2RmJHNleCkpKSwKICAgICAgIGNvbCA9IGMoMTo3KSwgbHR5ID0gMSwgbHdkID0gMywgY2V4ID0gMC43MCkKCmBgYAoKIyMjIyMgTWFsZSBwbG90cyBhZnRlciBub3JtYWxpemF0aW9uIAoKYGBge1J9CnBoZW5vX21hbGVfZGYgPC0gcGhlbm9fZGYgJT4lIGZpbHRlcihzZXggPT0gIk0iKQptYXRib3hwbG90KGJldGFRTl9tYWxlX2F1dG8sCiAgICAgICAgICAgZ3JvdXBGYWN0b3IgPSBwaGVub19tYWxlX2RmJHNleCwKICAgICAgICAgICB4YXh0ID0gIm4iLAogICAgICAgICAgIG1haW4gPSAiQmV0YSBWYWx1ZXMgKGF1dG9zb21lcykgLSBhZnRlciBub3JtYWxpemF0aW9uIikKbGVnZW5kKCdib3R0b20nLAogICAgICAgcGFzdGUwKCJzZXggIiwgbGV2ZWxzKGFzLmZhY3RvcihwaGVub19tYWxlX2RmJHNleCkpKSwKICAgICAgIGNvbCA9IGMoMTo3KSwgbHR5ID0gMSwgbHdkID0gMywgY2V4ID0gMC43MCkKCm1hdGJveHBsb3QoYmV0YVFOX21hbGVfWCwKICAgICAgICAgICBncm91cEZhY3RvciA9IHBoZW5vX21hbGVfZGYkc2V4LAogICAgICAgICAgIHhheHQgPSAibiIsCiAgICAgICAgICAgbWFpbiA9ICJCZXRhIFZhbHVlcyAoY2hyb21vc29tZSBYKSAtIGFmdGVyIG5vcm1hbGl6YXRpb24iKQpsZWdlbmQoJ2JvdHRvbScsCiAgICAgICBwYXN0ZTAoInNleCAiLCBsZXZlbHMoYXMuZmFjdG9yKHBoZW5vX21hbGVfZGYkc2V4KSkpLAogICAgICAgY29sID0gYygxOjcpLCBsdHkgPSAxLCBsd2QgPSAzLCBjZXggPSAwLjcwKQoKbWF0Ym94cGxvdChiZXRhUU5fbWFsZV9ZLAogICAgICAgICAgIGdyb3VwRmFjdG9yID0gcGhlbm9fbWFsZV9kZiRzZXgsCiAgICAgICAgICAgeGF4dCA9ICJuIiwKICAgICAgICAgICBtYWluID0gIkJldGEgVmFsdWVzIChjaHJvbW9zb21lIFkpIC0gYWZ0ZXIgbm9ybWFsaXphdGlvbiIpCmxlZ2VuZCgnYm90dG9tJywKICAgICAgIHBhc3RlMCgic2V4ICIsIGxldmVscyhhcy5mYWN0b3IocGhlbm9fbWFsZV9kZiRzZXgpKSksCiAgICAgICBjb2wgPSBjKDE6NyksIGx0eSA9IDEsIGx3ZCA9IDMsIGNleCA9IDAuNzApCmBgYAoKIyMgQk1JUQoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cyA9ICJoaWRlIn0KbGlicmFyeSh3YXRlUm1lbG9uKQpsaWJyYXJ5KFJQTU0pCmxpYnJhcnkoc2VzYW1lKQpsaWJyYXJ5KHNlc2FtZURhdGEpCmxpYnJhcnkoc20pCmBgYAoKIyMjIHRlc3QgcGVyY2VudGFnZSBvZiB0eXBlIEkgYW5kIHR5cGUgSUkgcHJvYmVzIHRoZW4gbm9ybWFsaXplIHRoZSBtYXRyaXgKCiMjIyMgb24gYXV0b3NvbWVzCgojIyMjIyBmb3IgZmVtYWxlcwoKYGBge1J9CiMjIyBPcmRlciBhbm5vdGF0aW9uIGluIHRoZSBzYW1lIG9yZGVyIGFzIGJldGEgbWF0cml4CmFubm90VHlwZSA8LSBzZXNhbWVEYXRhR2V0KCJITTQ1MC5oZzE5Lm1hbmlmZXN0IikKYW5ub3RUeXBlJGRlc2lnblR5cGVOdW1lcmljIDwtIGlmZWxzZShhbm5vdFR5cGUkZGVzaWduVHlwZSA9PSAiSSIsMSwyKQoKIyMjIERlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcwpiZXRhUU5Db21wbGV0ZUNvbDFfZmVtYWxlX2F1dG8gPC0gYmV0YVFOX2ZlbWFsZV9hdXRvW2NvbXBsZXRlLmNhc2VzKGJldGFRTl9mZW1hbGVfYXV0b1ssMV0pLCBdCmFubm90VHlwZUNvbXBsZXRlQ29sMV9mZW1hbGVfYXV0byA8LSBhbm5vdFR5cGVbcm93Lm5hbWVzKGJldGFRTkNvbXBsZXRlQ29sMV9mZW1hbGVfYXV0byksIF0KCnNtLmRlbnNpdHkuY29tcGFyZSgKICAgIGJldGFRTkNvbXBsZXRlQ29sMV9mZW1hbGVfYXV0b1ssMV0sCiAgICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfZmVtYWxlX2F1dG8kZGVzaWduVHlwZU51bWVyaWMpICsKICB0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBmZW1hbGUgYXV0b3NvbWVzIikKCiMjIyBTdW1tYXJ5IHRhYmxlCnR5cGUxMiA8LSBhbm5vdFR5cGUkZGVzaWduVHlwZU51bWVyaWNbbWF0Y2gocm93bmFtZXMoYmV0YVFOX2ZlbWFsZV9hdXRvKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKCmBgYHtSfQpzZXQuc2VlZCg5NDYpCmRvUGFyYWxsZWw6OnJlZ2lzdGVyRG9QYXJhbGxlbChjb3JlcyA9IDQpCmJldGFRTl9CTUlRX2ZlbWFsZV9hdXRvIDwtIHBseXI6OmFhcGx5KAogIGJldGFRTl9mZW1hbGVfYXV0bywgMiwKICBmdW5jdGlvbih4KXsKICAgIG5vcm1fbHMgPC0gQk1JUSh4LCBkZXNpZ24udiA9IHR5cGUxMiwgcGxvdHMgPSBGQUxTRSkKICAgIHJldHVybiAobm9ybV9scyRuYmV0YSkKICB9LC5wcm9ncmVzcyA9ICJ0aW1lIiwucGFyYWxsZWwgPSBUUlVFCikgJT4lIHQoKQpjb2xuYW1lcyhiZXRhUU5fQk1JUV9mZW1hbGVfYXV0bykgPC0gc3Vic3RyKGNvbG5hbWVzKGJldGFRTl9CTUlRX2ZlbWFsZV9hdXRvKSwxLHN0cmluZ3I6OnN0cl9sZW5ndGgocGhlbm9fZGYkc2FtcGxlKSAlPiUgdW5pcXVlKQpgYGAKCiMjIyMjIGZvciBtYWxlcwoKYGBge1J9CiMjIyBEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMKYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfYXV0byA8LSBiZXRhUU5fbWFsZV9hdXRvW2NvbXBsZXRlLmNhc2VzKGJldGFRTl9tYWxlX2F1dG9bLDFdKSwgXQphbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9hdXRvIDwtIGFubm90VHlwZVtyb3cubmFtZXMoYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfYXV0byksIF0KCnNtLmRlbnNpdHkuY29tcGFyZSgKICBiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9hdXRvWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9hdXRvJGRlc2lnblR5cGVOdW1lcmljCikKdGl0bGUobWFpbiA9ICJEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgb24gbWFsZSBhdXRvc29tZXMiKQoKIyMjIFN1bW1hcnkgdGFibGUKdHlwZTEyIDwtIGFubm90VHlwZSRkZXNpZ25UeXBlTnVtZXJpY1ttYXRjaChyb3duYW1lcyhiZXRhUU5fbWFsZV9hdXRvKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKYGBge1J9CnNldC5zZWVkKDk0NikKZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gNCkKYmV0YVFOX0JNSVFfbWFsZV9hdXRvIDwtIHBseXI6OmFhcGx5KAogIGJldGFRTl9tYWxlX2F1dG8sIDIsCiAgZnVuY3Rpb24oeCl7CiAgICBub3JtX2xzIDwtIEJNSVEoeCwgZGVzaWduLnYgPSB0eXBlMTIsIHBsb3RzID0gRkFMU0UpCiAgICByZXR1cm4gKG5vcm1fbHMkbmJldGEpCiAgfSwucHJvZ3Jlc3MgPSAidGltZSIsLnBhcmFsbGVsID0gVFJVRQopICU+JSB0KCkKY29sbmFtZXMoYmV0YVFOX0JNSVFfbWFsZV9hdXRvKSA8LSBzdWJzdHIoY29sbmFtZXMoYmV0YVFOX0JNSVFfbWFsZV9hdXRvKSwxLHN0cmluZ3I6OnN0cl9sZW5ndGgocGhlbm9fZGYkc2FtcGxlKSAlPiUgdW5pcXVlKQpgYGAKCiMjIyMgb24gY2hyb21vc29tZSBYCgojIyMjIyBmb3IgZmVtYWxlcwoKYGBge1J9CiMjIyBEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMKYmV0YVFOQ29tcGxldGVDb2wxX2ZlbWFsZV9YIDwtIGJldGFRTl9mZW1hbGVfWFtjb21wbGV0ZS5jYXNlcyhiZXRhUU5fZmVtYWxlX1hbLDFdKSwgXQphbm5vdFR5cGVDb21wbGV0ZUNvbDFfZmVtYWxlX1ggPC0gYW5ub3RUeXBlW3Jvdy5uYW1lcyhiZXRhUU5Db21wbGV0ZUNvbDFfZmVtYWxlX1gpLCBdCgpzbS5kZW5zaXR5LmNvbXBhcmUoCiAgYmV0YVFOQ29tcGxldGVDb2wxX2ZlbWFsZV9YWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfZmVtYWxlX1gkZGVzaWduVHlwZU51bWVyaWMKKQp0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBmZW1hbGUgY2hyb21vc29tZSBYIikKCiMjIyBTdW1tYXJ5IHRhYmxlCnR5cGUxMiA8LSBhbm5vdFR5cGUkZGVzaWduVHlwZU51bWVyaWNbbWF0Y2gocm93bmFtZXMoYmV0YVFOX2ZlbWFsZV9YKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKCiMjIyMjIGZvciBtYWxlcwoKYGBge1J9CiMjIyBEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMKYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfWCA8LSBiZXRhUU5fbWFsZV9YW2NvbXBsZXRlLmNhc2VzKGJldGFRTl9tYWxlX1hbLDFdKSwgXQphbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9YIDwtIGFubm90VHlwZVtyb3cubmFtZXMoYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfWCksIF0KCnNtLmRlbnNpdHkuY29tcGFyZSgKICBiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9YWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9YJGRlc2lnblR5cGVOdW1lcmljCikKdGl0bGUobWFpbiA9ICJEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgb24gbWFsZSBjaHJvbW9zb21lIFgiKQoKIyMjIFN1bW1hcnkgdGFibGUKdHlwZTEyIDwtIGFubm90VHlwZSRkZXNpZ25UeXBlTnVtZXJpY1ttYXRjaChyb3duYW1lcyhiZXRhUU5fbWFsZV9YKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKCiMjIyMgb24gY2hyb21vc29tZSBZCgpgYGB7Un0KIyMjIERlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcwpiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9ZIDwtIGJldGFRTl9tYWxlX1lbY29tcGxldGUuY2FzZXMoYmV0YVFOX21hbGVfWVssMV0pLCBdCmFubm90VHlwZUNvbXBsZXRlQ29sMV9tYWxlX1kgPC0gYW5ub3RUeXBlW3Jvdy5uYW1lcyhiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9ZKSwgXQoKc20uZGVuc2l0eS5jb21wYXJlKAogIGJldGFRTkNvbXBsZXRlQ29sMV9tYWxlX1lbLDFdLAogIGFubm90VHlwZUNvbXBsZXRlQ29sMV9tYWxlX1kkZGVzaWduVHlwZU51bWVyaWMKKQp0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBjaHJvbW9zb21lIFkiKQoKIyMjIFN1bW1hcnkgdGFibGUKdHlwZTEyIDwtIGFubm90VHlwZSRkZXNpZ25UeXBlTnVtZXJpY1ttYXRjaChyb3duYW1lcyhiZXRhUU5fbWFsZV9ZKSxuYW1lcyhhbm5vdFR5cGUpKV0KdGFibGUodHlwZTEyKQpgYGAKCiMjIyBzYXZlIGRlbnNpdHkgcGxvdHMgYW5kIG5vcm1hbGl6ZWQgZGF0YXNldHMKCmBgYHtSfQojIyMgc2F2ZSBwbG90cwpwZGYocGFzdGUwKGRhdGEuZGlyLnByb2Jlcy5ub3JtYWxpemF0aW9uLCAiL2RlbnNpdHlQbG90QnlQcm9iZVR5cGUucGRmIikpCgpzbS5kZW5zaXR5LmNvbXBhcmUoCiAgYmV0YVFOQ29tcGxldGVDb2wxX2ZlbWFsZV9hdXRvWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfZmVtYWxlX2F1dG8kZGVzaWduVHlwZU51bWVyaWMKKQp0aXRsZShtYWluID0gIkRlbnNpdHkgcGxvdCBmb3IgdHlwZSBJIGFuZCB0eXBlIElJIHByb2JlcyBvbiBmZW1hbGUgYXV0b3NvbWVzIikKCnNtLmRlbnNpdHkuY29tcGFyZSgKICBiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9hdXRvWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9hdXRvJGRlc2lnblR5cGVOdW1lcmljCikKdGl0bGUobWFpbiA9ICJEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgb24gbWFsZSBhdXRvc29tZXMiKQoKc20uZGVuc2l0eS5jb21wYXJlKAogIGJldGFRTkNvbXBsZXRlQ29sMV9mZW1hbGVfWFssMV0sCiAgYW5ub3RUeXBlQ29tcGxldGVDb2wxX2ZlbWFsZV9YJGRlc2lnblR5cGVOdW1lcmljCikKdGl0bGUobWFpbiA9ICJEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgb24gZmVtYWxlIGNocm9tb3NvbWUgWCIpCgpzbS5kZW5zaXR5LmNvbXBhcmUoCiAgYmV0YVFOQ29tcGxldGVDb2wxX21hbGVfWFssMV0sCiAgYW5ub3RUeXBlQ29tcGxldGVDb2wxX21hbGVfWCRkZXNpZ25UeXBlTnVtZXJpYwopCnRpdGxlKG1haW4gPSAiRGVuc2l0eSBwbG90IGZvciB0eXBlIEkgYW5kIHR5cGUgSUkgcHJvYmVzIG9uIG1hbGUgY2hyb21vc29tZSBYIikKCnNtLmRlbnNpdHkuY29tcGFyZSgKICBiZXRhUU5Db21wbGV0ZUNvbDFfbWFsZV9ZWywxXSwKICBhbm5vdFR5cGVDb21wbGV0ZUNvbDFfbWFsZV9ZJGRlc2lnblR5cGVOdW1lcmljCikKdGl0bGUobWFpbiA9ICJEZW5zaXR5IHBsb3QgZm9yIHR5cGUgSSBhbmQgdHlwZSBJSSBwcm9iZXMgb24gY2hyb21vc29tZSBZIikKCmRldi5vZmYoKQoKIyMjIGNvbWJpbmVkIG5vcm1hbGl6ZWQgbWF0cmljZXMKYmV0YVFOX0JNSVFfZmVtYWxlIDwtIHJiaW5kKGJldGFRTl9CTUlRX2ZlbWFsZV9hdXRvLCBiZXRhUU5fZmVtYWxlX1gpCmJldGFRTl9CTUlRX21hbGUgPC0gcmJpbmQoYmV0YVFOX0JNSVFfbWFsZV9hdXRvLCBiZXRhUU5fbWFsZV9YLCBiZXRhUU5fbWFsZV9ZKQpzYXZlKGJldGFRTl9CTUlRX2ZlbWFsZSwgYmV0YVFOX0JNSVFfbWFsZSwgcGhlbm9fZGYsIGZpbGUgPSBwYXN0ZTAoZGF0YS5kaXIucHJvYmVzLm5vcm1hbGl6YXRpb24sICIvR0FTUEFST05JX1FOQk1JUS5yZGEiKSkKCmBgYAoKIyBPdXRsaWVycyBkZXRlY3Rpb24gLSBQQ0EgYW5hbHlzaXMKCi0gU2VsZWN0IG1vc3QgdmFyaWFibGUgcHJvYmVzIGFuZCBwZXJmb3JtIFBDQSBhbmFseXNpcwoKSW5wdXQ6IAoKLSBHQVNQQVJPTklfUU5CTUlRLnJkcyAgCi0gcGhlbm9fZGYuUkRTICAKCk91dHB1dDogCgotIEdBU1BBUk9OSV9QQ3NfdXNpbmdCZXRhcy5jc3YsIAotIFBDQSBwbG90cwotIEdBU1BBUk9OSV9RTkJNSVFfUENmaWx0ZXJlZC5SRFMKLSBwaGVub19kZi5SRFMKCmBgYHtSfQojIHBsb3RQQ0EgYW5kIE9yZGVyRGF0YUJ5U2QgZnVuY3Rpb25zCmRldnRvb2xzOjpzb3VyY2VfZ2lzdCgiaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdGlhZ29jaHN0L2QzYTdiMTYzOWFjZjYwMzkxNmMzMTVkMjNiMWVmYjNlIikKYGBgCgpgYGB7Un0KIyMjIG1lcmdlIGluIGdyb3VwIGluZm8KIyMgYWRkIGNlbnRlciBhbmQgc2NhbGUKIyMgY29tcGFyZSBNIHZhbHVlcyB2cy4gYmV0YSB2YWx1ZXMKIyMgd2l0aCBhbmQgd2l0aG91dCBjZW50ZXIgLyBzY2FsZQpsb2FkKHBhc3RlMChkYXRhLmRpci5wcm9iZXMubm9ybWFsaXphdGlvbiwgIi9HQVNQQVJPTklfUU5CTUlRLnJkYSIpKQpgYGAKCiMjIGZvciBmZW1hbGVzICAKCmBgYHtSfQpwaGVub19mZW1hbGVfZGYgPC0gcGhlbm9fZGYgJT4lIGZpbHRlcihzZXggPT0gIkYiKQpwaGVub19mZW1hbGVfZGYkc3RhZ2UzIDwtIGlmZWxzZSgKICBwaGVub19mZW1hbGVfZGYkc3RhZ2UgJWluJSBjKDAsMSwyKSwgIjAtMiIsCiAgaWZlbHNlKHBoZW5vX2ZlbWFsZV9kZiRzdGFnZSAlaW4lIGMoMyw0KSwgIjMtNCIsICI1LTYiKQopCmJldGFRTl9CTUlRX2ZlbWFsZSA8LSBiZXRhUU5fQk1JUV9mZW1hbGVbICwgcGhlbm9fZmVtYWxlX2RmJHNhbXBsZV0KCiMjIyB0cmFuc2Zvcm0gdG8gbSB2YWx1ZXMKbXZhbHVlX21hdCA8LSBsb2cyKGJldGFRTl9CTUlRX2ZlbWFsZSAvICgxIC0gYmV0YVFOX0JNSVFfZmVtYWxlKSkgI2RpbTogNDU3NDAyIDMwCgojIyMgb3JkZXIgbWF0cml4IGJ5IG1vc3QgdmFyaWFibGUgcHJvYmVzIG9uIHRvcApiZXRhT3JkX21hdCA8LSBPcmRlckRhdGFCeVNkKGJldGFRTl9CTUlRX2ZlbWFsZSkgI2RpbTogNDU3NDAyIDMwCm1PcmRfbWF0IDwtIE9yZGVyRGF0YUJ5U2QobXZhbHVlX21hdCkgICNkaW06IDQ1NzQwMiAzMAoKaWRlbnRpY2FsKHBoZW5vX2ZlbWFsZV9kZiRzYW1wbGUsIGNvbG5hbWVzKGJldGFPcmRfbWF0KSkKaWRlbnRpY2FsKHBoZW5vX2ZlbWFsZV9kZiRzYW1wbGUsIGNvbG5hbWVzKG1PcmRfbWF0KSkKCnBjYSA8LSBwcmNvbXAodChiZXRhT3JkX21hdFsxOjUwMDAwLCBdKSwKICAgICAgICAgICAgICBjZW50ZXIgPSBUUlVFLAogICAgICAgICAgICAgIHNjYWxlID0gVFJVRSkKCmQgPC0gZGF0YS5mcmFtZShQQzEgPSBwY2EkeFssIDFdLCBQQzIgPSBwY2EkeFssIDJdKQoKbWVhblBDMSA8LSBtZWFuIChkJFBDMSkKc2RQQzEgICA8LSBzZCAoZCRQQzEpCgptZWFuUEMyIDwtIG1lYW4gKGQkUEMyKQpzZFBDMiAgIDwtIHNkIChkJFBDMikKCm91dDNzZFBDMV8xIDwtIG1lYW5QQzEgLSAzICogc2RQQzEKb3V0M3NkUEMxXzIgPC0gbWVhblBDMSArIDMgKiBzZFBDMQoKb3V0M3NkUEMyXzEgPC0gbWVhblBDMiAtIDMgKiBzZFBDMgpvdXQzc2RQQzJfMiA8LSBtZWFuUEMyICsgMyAqIHNkUEMyCgpkJG91dGxpZXJfUEMxW2QkUEMxID49IG91dDNzZFBDMV8xICYgZCRQQzEgPD0gb3V0M3NkUEMxXzJdIDwtIDAKZCRvdXRsaWVyX1BDMVtkJFBDMSA8IG91dDNzZFBDMV8xIHwgZCRQQzEgPiBvdXQzc2RQQzFfMl0gPC0gMQoKZCRvdXRsaWVyX1BDMltkJFBDMiA+PSBvdXQzc2RQQzJfMSAmIGQkUEMyIDw9IG91dDNzZFBDMl8yXSA8LSAwCmQkb3V0bGllcl9QQzJbZCRQQzIgPCBvdXQzc2RQQzJfMSB8IGQkUEMyID4gb3V0M3NkUEMyXzJdIDwtIDEKCnJlYWRyOjp3cml0ZV9jc3YoZCwgcGFzdGUwKGRhdGEuZGlyLnBjYSwgIi9HQVNQQVJPTklfUENzX3VzaW5nQmV0YXNfZmVtYWxlLmNzdiIpKQpgYGAKCmBgYHtSLCBldmFsID0gVFJVRSwgaW5jbHVkZSA9IFRSVUV9CiMjIyAyLlBDQSBwbG90CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JlcGVsKQoKIyMjIEJlYXRhIHZhbHVlcwpieVN0YWdlIDwtIHBsb3RQQ0EoCiAgZGF0YXNldCA9ICJHYXNwYXJvbmk6IGJldGEgdmFsdWVzIiwKICBleHBTb3J0ZWRfbWF0ID0gYmV0YU9yZF9tYXQsCiAgcGhlbm8gPSBwaGVub19mZW1hbGVfZGYsCiAgZ3JvdXBfY2hhciA9ICJzdGFnZTMiLAogIG50b3AgPSA1MDAwMCwKICBjZW50ZXIgPSBUUlVFLAogIHNjYWxlID0gVFJVRQopCgojIyMgTSB2YWx1ZXMKYnlTdGFnZSA8LSBwbG90UENBKAogIGRhdGFzZXQgPSAiR2FzcGFyb25pOiBNIHZhbHVlcyIsCiAgZXhwU29ydGVkX21hdCA9IG1PcmRfbWF0LAogIHBoZW5vID0gcGhlbm9fZmVtYWxlX2RmLAogIGdyb3VwX2NoYXIgPSAic3RhZ2UzIiwKICBudG9wID0gNTAwMDAsCiAgY2VudGVyID0gVFJVRSwKICBzY2FsZSA9IFRSVUUKKQpgYGAKCmBgYHtSfQojIyMgRmlsdGVyIHNhbXBsZXMgYnkgUENBLCBzYXZlIGZpbGVzCm5vT3V0bGllcnMgPC0gZFt3aGljaChkJG91dGxpZXJfUEMxID09IDAgJiBkJG91dGxpZXJfUEMyID09IDApLCBdCmJldGFRTl9CTUlRX1BDZmlsdGVyZWRfZmVtYWxlIDwtIGJldGFRTl9CTUlRX2ZlbWFsZVssIHJvd25hbWVzKG5vT3V0bGllcnMpXSAjZGltOiA0NTc0MDIgMjkKc2F2ZVJEUyhiZXRhUU5fQk1JUV9QQ2ZpbHRlcmVkX2ZlbWFsZSwgcGFzdGUwKGRhdGEuZGlyLnBjYSwgIkdhc3Bhcm9uaV9RTkJNSVFfUENmaWx0ZXJlZF9mZW1hbGUuUkRTIikpCgpwaGVub19mZW1hbGVfZGYgPC0gcGhlbm9fZmVtYWxlX2RmW3BoZW5vX2ZlbWFsZV9kZiRzYW1wbGUgJWluJSByb3duYW1lcyhub091dGxpZXJzKSxdICNkaW06IDI5IDcKc2F2ZVJEUyhwaGVub19mZW1hbGVfZGYsIHBhc3RlMChkYXRhLmRpci5wY2EsICIvcGhlbm9fZmVtYWxlX2RmLlJEUyIpKQpgYGAKCiMjIGZvciBtYWxlcyAgCgpgYGB7Un0KcGhlbm9fbWFsZV9kZiA8LSBwaGVub19kZiAlPiUgZmlsdGVyKHNleCA9PSAiTSIpCnBoZW5vX21hbGVfZGYkc3RhZ2UzIDwtIGlmZWxzZSgKICBwaGVub19tYWxlX2RmJHN0YWdlICVpbiUgYygwLDEsMiksICIwLTIiLAogIGlmZWxzZShwaGVub19tYWxlX2RmJHN0YWdlICVpbiUgYygzLDQpLCAiMy00IiwgIjUtNiIpCikKYmV0YVFOX0JNSVFfbWFsZSA8LSBiZXRhUU5fQk1JUV9tYWxlWyAsIHBoZW5vX21hbGVfZGYkc2FtcGxlXQoKIyMjIHRyYW5zZm9ybSB0byBtIHZhbHVlcwptdmFsdWVfbWF0IDwtIGxvZzIoYmV0YVFOX0JNSVFfbWFsZSAvICgxIC0gYmV0YVFOX0JNSVFfbWFsZSkpICNkaW06IDQ1NzQ2NCAyNwoKIyMjIG9yZGVyIG1hdHJpeCBieSBtb3N0IHZhcmlhYmxlIHByb2JlcyBvbiB0b3AKYmV0YU9yZF9tYXQgPC0gT3JkZXJEYXRhQnlTZChiZXRhUU5fQk1JUV9tYWxlKSAjZGltOiA0NTc0NjQgMjcKbU9yZF9tYXQgPC0gT3JkZXJEYXRhQnlTZChtdmFsdWVfbWF0KSAgI2RpbTogNDU3NDY0IDI3CgppZGVudGljYWwocGhlbm9fbWFsZV9kZiRzYW1wbGUsIGNvbG5hbWVzKGJldGFPcmRfbWF0KSkKaWRlbnRpY2FsKHBoZW5vX21hbGVfZGYkc2FtcGxlLCBjb2xuYW1lcyhtT3JkX21hdCkpCgpwY2EgPC0gcHJjb21wKHQoYmV0YU9yZF9tYXRbMTo1MDAwMCwgXSksCiAgICAgICAgICAgICAgY2VudGVyID0gVFJVRSwKICAgICAgICAgICAgICBzY2FsZSA9IFRSVUUpCgpkIDwtIGRhdGEuZnJhbWUoUEMxID0gcGNhJHhbLCAxXSwgUEMyID0gcGNhJHhbLCAyXSkKCm1lYW5QQzEgPC0gbWVhbiAoZCRQQzEpCnNkUEMxICAgPC0gc2QgKGQkUEMxKQoKbWVhblBDMiA8LSBtZWFuIChkJFBDMikKc2RQQzIgICA8LSBzZCAoZCRQQzIpCgpvdXQzc2RQQzFfMSA8LSBtZWFuUEMxIC0gMyAqIHNkUEMxCm91dDNzZFBDMV8yIDwtIG1lYW5QQzEgKyAzICogc2RQQzEKCm91dDNzZFBDMl8xIDwtIG1lYW5QQzIgLSAzICogc2RQQzIKb3V0M3NkUEMyXzIgPC0gbWVhblBDMiArIDMgKiBzZFBDMgoKZCRvdXRsaWVyX1BDMVtkJFBDMSA+PSBvdXQzc2RQQzFfMSAmIGQkUEMxIDw9IG91dDNzZFBDMV8yXSA8LSAwCmQkb3V0bGllcl9QQzFbZCRQQzEgPCBvdXQzc2RQQzFfMSB8IGQkUEMxID4gb3V0M3NkUEMxXzJdIDwtIDEKCmQkb3V0bGllcl9QQzJbZCRQQzIgPj0gb3V0M3NkUEMyXzEgJiBkJFBDMiA8PSBvdXQzc2RQQzJfMl0gPC0gMApkJG91dGxpZXJfUEMyW2QkUEMyIDwgb3V0M3NkUEMyXzEgfCBkJFBDMiA+IG91dDNzZFBDMl8yXSA8LSAxCgpyZWFkcjo6d3JpdGVfY3N2KGQsIHBhc3RlMChkYXRhLmRpci5wY2EsICIvR0FTUEFST05JX1BDc191c2luZ0JldGFzX21hbGUuY3N2IikpCmBgYAoKYGBge1IsIGV2YWwgPSBUUlVFLCBpbmNsdWRlID0gVFJVRX0KIyMjIDIuUENBIHBsb3QKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncmVwZWwpCgojIyMgQmVhdGEgdmFsdWVzCmJ5U3RhZ2UgPC0gcGxvdFBDQSgKICBkYXRhc2V0ID0gIkdhc3Bhcm9uaTogYmV0YSB2YWx1ZXMiLAogIGV4cFNvcnRlZF9tYXQgPSBiZXRhT3JkX21hdCwKICBwaGVubyA9IHBoZW5vX21hbGVfZGYsCiAgZ3JvdXBfY2hhciA9ICJzdGFnZTMiLAogIG50b3AgPSA1MDAwMCwKICBjZW50ZXIgPSBUUlVFLAogIHNjYWxlID0gVFJVRQopCgojIyMgTSB2YWx1ZXMKYnlTdGFnZSA8LSBwbG90UENBKAogIGRhdGFzZXQgPSAiR2FzcGFyb25pOiBNIHZhbHVlcyIsCiAgZXhwU29ydGVkX21hdCA9IG1PcmRfbWF0LAogIHBoZW5vID0gcGhlbm9fbWFsZV9kZiwKICBncm91cF9jaGFyID0gInN0YWdlMyIsCiAgbnRvcCA9IDUwMDAwLAogIGNlbnRlciA9IFRSVUUsCiAgc2NhbGUgPSBUUlVFCikKYGBgCgoKYGBge1J9CiMjIyBGaWx0ZXIgc2FtcGxlcyBieSBQQ0EsIHNhdmUgZmlsZXMKbm9PdXRsaWVycyA8LSBkW3doaWNoKGQkb3V0bGllcl9QQzEgPT0gMCAmIGQkb3V0bGllcl9QQzIgPT0gMCksIF0KYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9tYWxlIDwtIGJldGFRTl9CTUlRX21hbGVbLCByb3duYW1lcyhub091dGxpZXJzKV0gI2RpbTogNDU3NDY0IDI3CnNhdmVSRFMoYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9tYWxlLCBwYXN0ZTAoZGF0YS5kaXIucGNhLCAiR2FzcGFyb25pX1FOQk1JUV9QQ2ZpbHRlcmVkX21hbGUuUkRTIikpCgpwaGVub19tYWxlX2RmIDwtIHBoZW5vX21hbGVfZGZbcGhlbm9fbWFsZV9kZiRzYW1wbGUgJWluJSByb3duYW1lcyhub091dGxpZXJzKSxdICNkaW06IDI3IDcKc2F2ZVJEUyhwaGVub19tYWxlX2RmLCBwYXN0ZTAoZGF0YS5kaXIucGNhLCAiL3BoZW5vX21hbGVfZGYuUkRTIikpCmBgYAoKIyBTdW1tYXJ5IGFmdGVyIFFDIHN0ZXBzCgojIyBEYXRhIGFuZCBtZXRhZGF0YQpgYGB7Un0KbmIuc2FtcGxlcy5wY2EgPC0gbmNvbChiZXRhUU5fQk1JUV9QQ2ZpbHRlcmVkX2ZlbWFsZSkgKyBuY29sKGJldGFRTl9CTUlRX1BDZmlsdGVyZWRfbWFsZSkKbmIuZmVtYWxlLnNhbXBsZXMucGNhIDwtIG5jb2woYmV0YVFOX0JNSVFfUENmaWx0ZXJlZF9mZW1hbGUpCm5iLm1hbGUuc2FtcGxlcy5wY2EgPC0gbmNvbChiZXRhUU5fQk1JUV9QQ2ZpbHRlcmVkX21hbGUpCmRpbShiZXRhUU5fQk1JUV9QQ2ZpbHRlcmVkX2ZlbWFsZSkKZGltKGJldGFRTl9CTUlRX1BDZmlsdGVyZWRfbWFsZSkKZGltKHBoZW5vX2ZlbWFsZV9kZikKZGltKHBoZW5vX21hbGVfZGYpCmBgYAoKYGBge1Igd2FybmluZz1UUlVFLCBzaG93ID0gRkFMU0V9CnBoZW5vX2ZlbWFsZV9kZiAlPiUgCiAgRFQ6OmRhdGF0YWJsZShmaWx0ZXIgPSAndG9wJywKICAgICAgICAgICAgICAgIHN0eWxlID0gImJvb3RzdHJhcCIsCiAgICAgICAgICAgICAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gJ0JmcnRpcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gSSgnY29sdmlzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTApLCAKICAgICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICBjYXB0aW9uID0gIkZlbWFsZSBzYW1wbGVzIG1ldGFkYXRhIikKCnBoZW5vX21hbGVfZGYgJT4lIAogIERUOjpkYXRhdGFibGUoZmlsdGVyID0gJ3RvcCcsCiAgICAgICAgICAgICAgICBzdHlsZSA9ICJib290c3RyYXAiLAogICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNjcm9sbFggPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9ICdCZnJ0aXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IEkoJ2NvbHZpcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDEwKSwgCiAgICAgICAgICAgICAgICByb3duYW1lcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJNYWxlIHNhbXBsZXMgbWV0YWRhdGEiKQpgYGAKCmBgYHtSLCBldmFsID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KZ2dwdWJyOjpnZ2hpc3RvZ3JhbShkYXRhID0gcGhlbm9fZmVtYWxlX2RmLCB4ID0gInN0YWdlIixiaW5zID0gOCkKIyBnZ3B1YnI6OmdnaGlzdG9ncmFtKGRhdGEgPSBwaGVub19mZW1hbGVfZGYsIHggPSAic3RhZ2UiLGJpbnMgPSA4LGZhY2V0LmJ5ID0gInNleCIsZmlsbCA9ICJzZXgiKQpnZ3B1YnI6OmdnaGlzdG9ncmFtKGRhdGEgPSBwaGVub19mZW1hbGVfZGYsIHggPSAiYWdlLmJyYWluIixiaW5zID0gMjApCiMgZ2dwdWJyOjpnZ2hpc3RvZ3JhbShkYXRhID0gcGhlbm9fZmVtYWxlX2RmLCB4ID0gImFnZS5icmFpbiIsYmlucyA9IDIwLGZpbGwgPSAic2V4IixmYWNldC5ieSA9ICJzZXgiKQoKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShkYXRhID0gcGhlbm9fbWFsZV9kZiwgeCA9ICJzdGFnZSIsYmlucyA9IDgpCiMgZ2dwdWJyOjpnZ2hpc3RvZ3JhbShkYXRhID0gcGhlbm9fbWFsZV9kZiwgeCA9ICJzdGFnZSIsYmlucyA9IDgsZmFjZXQuYnkgPSAic2V4IixmaWxsID0gInNleCIpCmdncHVicjo6Z2doaXN0b2dyYW0oZGF0YSA9IHBoZW5vX21hbGVfZGYsIHggPSAiYWdlLmJyYWluIixiaW5zID0gMjApCiMgZ2dwdWJyOjpnZ2hpc3RvZ3JhbShkYXRhID0gcGhlbm9fbWFsZV9kZiwgeCA9ICJhZ2UuYnJhaW4iLGJpbnMgPSAyMCxmaWxsID0gInNleCIsZmFjZXQuYnkgPSAic2V4IikKYGBgCgoKIyMgTnVtYmVycyBvZiBzYW1wbGVzIGFuZCBwcm9iZXMgcmVtb3ZlZCBpbiBlYWNoIHN0ZXAKCmBgYHtSfQpkZi5zYW1wbGVzIDwtIGRhdGEuZnJhbWUoCiAgIk51bWJlciBvZiBzYW1wbGVzIiA9ICBjKG5iLnNhbXBsZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLmJjLmZpbHRlcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLndpdGguY2xpbmljYWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLnBjYSksCiAgIkRlc2NyaXB0aW9uIiA9IGMoInRvdGFsIG51bWJlciBvZiBzYW1wbGVzIiwKICAgICAgICAgICAgICAgICAgICAic2FtcGxlcyB3aXRoIGJpc3VsZmF0ZSBjb252ZXJzaW9uID4gODgiLAogICAgICAgICAgICAgICAgICAgICJzYW1wbGVzIHdpdGggY2xpbmljYWwgZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgIlNhbXBsZXMgYWZ0ZXIgUENBIiksCiAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLmJjLmZpbHRlcmVkIC0gbmIuc2FtcGxlcyAsCiAgICAgICAgICAgICAgICAgICBuYi5zYW1wbGVzLndpdGguY2xpbmljYWwgLSBuYi5zYW1wbGVzLmJjLmZpbHRlcmVkICwKICAgICAgICAgICAgICAgICAgIG5iLnNhbXBsZXMucGNhIC0gbmIuc2FtcGxlcy53aXRoLmNsaW5pY2FsKQopICAgIApkZi5zYW1wbGVzICAgICAgICAgICAKCgpkZi5mZW1hbGUuc2FtcGxlcyA8LSBkYXRhLmZyYW1lKAogICJOdW1iZXIgb2Ygc2FtcGxlcyIgPSAgYyhuYi5mZW1hbGUuc2FtcGxlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmZlbWFsZS5zYW1wbGVzLmJjLmZpbHRlcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5mZW1hbGUuc2FtcGxlcy53aXRoLmNsaW5pY2FsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuZmVtYWxlLnNhbXBsZXMucGNhKSwKICAiRGVzY3JpcHRpb24iID0gYygiRmVtYWxlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIiwKICAgICAgICAgICAgICAgICAgICAiRmVtYWxlIHNhbXBsZXMgd2l0aCBiaXN1bGZhdGUgY29udmVyc2lvbiA+IDg4IiwKICAgICAgICAgICAgICAgICAgICAiRmVtYWxlIHNhbXBsZXMgd2l0aCBjbGluaWNhbCBkYXRhIiwKICAgICAgICAgICAgICAgICAgICAiRmVtYWxlIHNhbXBsZXMgYWZ0ZXIgUENBIiksCiAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICBuYi5mZW1hbGUuc2FtcGxlcy5iYy5maWx0ZXJlZCAtIG5iLmZlbWFsZS5zYW1wbGVzICwKICAgICAgICAgICAgICAgICAgIG5iLmZlbWFsZS5zYW1wbGVzLndpdGguY2xpbmljYWwgLSBuYi5mZW1hbGUuc2FtcGxlcy5iYy5maWx0ZXJlZCwKICAgICAgICAgICAgICAgICAgIG5iLmZlbWFsZS5zYW1wbGVzLnBjYSAtIG5iLmZlbWFsZS5zYW1wbGVzLndpdGguY2xpbmljYWwpCikgICAgCmRmLmZlbWFsZS5zYW1wbGVzICAgICAgICAgICAKCgpkZi5tYWxlLnNhbXBsZXMgPC0gZGF0YS5mcmFtZSgKICAiTnVtYmVyIG9mIHNhbXBsZXMiID0gIGMobmIubWFsZS5zYW1wbGVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIubWFsZS5zYW1wbGVzLmJjLmZpbHRlcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5tYWxlLnNhbXBsZXMud2l0aC5jbGluaWNhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLm1hbGUuc2FtcGxlcy5wY2EpLAogICJEZXNjcmlwdGlvbiIgPSBjKCJNYWxlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIiwKICAgICAgICAgICAgICAgICAgICAiTWFsZSBzYW1wbGVzIHdpdGggYmlzdWxmYXRlIGNvbnZlcnNpb24gPiA4OCIsCiAgICAgICAgICAgICAgICAgICAgIk1hbGUgc2FtcGxlcyB3aXRoIGNsaW5pY2FsIGRhdGEiLAogICAgICAgICAgICAgICAgICAgICJNYWxlIHNhbXBsZXMgYWZ0ZXIgUENBIiksCiAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICBuYi5tYWxlLnNhbXBsZXMuYmMuZmlsdGVyZWQgLSBuYi5tYWxlLnNhbXBsZXMgLAogICAgICAgICAgICAgICAgICAgbmIubWFsZS5zYW1wbGVzLndpdGguY2xpbmljYWwgLSBuYi5tYWxlLnNhbXBsZXMuYmMuZmlsdGVyZWQgLAogICAgICAgICAgICAgICAgICAgbmIubWFsZS5zYW1wbGVzLnBjYSAtIG5iLm1hbGUuc2FtcGxlcy53aXRoLmNsaW5pY2FsKQopICAgIApkZi5tYWxlLnNhbXBsZXMgICAgICAgICAgIAoKIyBDcmVhdGUgc3VtbWFyeSB0YWJsZQpkZi5wcm9iZXMgPC0gZGF0YS5mcmFtZSgiTnVtYmVyIG9mIHByb2JlcyIgPSBjKG5iLnByb2JlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5wcm9iZXMuZGV0ZWN0UCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIucHJvYmVzLmRldGVjdFAuY2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIucHJvYmVzLmNnLmRtcmNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIucHJvYmVzLmRtcmNhdGUuY2hyTSksCiAgICAgICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdGlvbiIgPSBjKCJ0b3RhbCBudW1iZXIgb2YgcHJvYmVzIGluIHJhdyBkYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRldGVjdGlvbiBQIDwgMC4wMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IHByb2JlcyB0aGF0IHN0YXJ0IHdpdGggY2ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRE1SY2F0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWxldGUgcHJvYmVzIG9uIGNock0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIucHJvYmVzLmRldGVjdFAgLSBuYi5wcm9iZXMgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLnByb2Jlcy5kZXRlY3RQLmNnIC0gbmIucHJvYmVzLmRldGVjdFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIucHJvYmVzLmNnLmRtcmNhdGUgLSBuYi5wcm9iZXMuZGV0ZWN0UC5jZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5wcm9iZXMuZG1yY2F0ZS5jaHJNIC0gbmIucHJvYmVzLmNnLmRtcmNhdGUpCikKZGYucHJvYmVzCgpkZi5jaHJBdXRvLnByb2JlcyA8LSBkYXRhLmZyYW1lKCJOdW1iZXIgb2YgcHJvYmVzIiA9IGMobmIuY2hyQXV0by5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJBdXRvLnByb2Jlcy5kZXRlY3RQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UC5jZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNockF1dG8ucHJvYmVzLmNnLmRtcmNhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb24iID0gYygiYXV0b3NvbWUgdG90YWwgbnVtYmVyIG9mIHByb2JlcyBpbiByYXcgZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXRvc29tZSBkZXRlY3Rpb24gUCA8IDAuMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0b3NvbWUgb25seSBwcm9iZXMgdGhhdCBzdGFydCB3aXRoIGNnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1dG9zb21lIERNUmNhdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRpZmZlcmVuY2UiID0gYygiLSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UCAtIG5iLmNockF1dG8ucHJvYmVzICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJBdXRvLnByb2Jlcy5kZXRlY3RQLmNnIC0gbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJBdXRvLnByb2Jlcy5jZy5kbXJjYXRlIC0gbmIuY2hyQXV0by5wcm9iZXMuZGV0ZWN0UC5jZykKKQpkZi5jaHJBdXRvLnByb2JlcwoKZGYuY2hyWC5wcm9iZXMgPC0gZGF0YS5mcmFtZSgiTnVtYmVyIG9mIHByb2JlcyIgPSBjKG5iLmNoclgucHJvYmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWC5wcm9iZXMuZGV0ZWN0UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclgucHJvYmVzLmRldGVjdFAuY2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJYLnByb2Jlcy5jZy5kbXJjYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRlc2NyaXB0aW9uIiA9IGMoImNocm9tb3NvbWUgWCB0b3RhbCBudW1iZXIgb2YgcHJvYmVzIGluIHJhdyBkYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNocm9tb3NvbWUgWCBkZXRlY3Rpb24gUCA8IDAuMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hyb21vc29tZSBYIG9ubHkgcHJvYmVzIHRoYXQgc3RhcnQgd2l0aCBjZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaHJvbW9zb21lIFggRE1SY2F0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGlmZmVyZW5jZSIgPSBjKCItIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJYLnByb2Jlcy5kZXRlY3RQIC0gbmIuY2hyWC5wcm9iZXMgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclgucHJvYmVzLmRldGVjdFAuY2cgLSBuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclgucHJvYmVzLmNnLmRtcmNhdGUgLSBuYi5jaHJYLnByb2Jlcy5kZXRlY3RQLmNnKQopCmRmLmNoclgucHJvYmVzCgpkZi5jaHJZLnByb2JlcyA8LSBkYXRhLmZyYW1lKCJOdW1iZXIgb2YgcHJvYmVzIiA9IGMobmIuY2hyWS5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYi5jaHJZLnByb2Jlcy5kZXRlY3RQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWS5wcm9iZXMuZGV0ZWN0UC5jZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclkucHJvYmVzLmNnLmRtcmNhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb24iID0gYygiY2hyb21vc29tZSBZIHRvdGFsIG51bWJlciBvZiBwcm9iZXMgaW4gcmF3IGRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hyb21vc29tZSBZIGRldGVjdGlvbiBQIDwgMC4wMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaHJvbW9zb21lIFkgb25seSBwcm9iZXMgdGhhdCBzdGFydCB3aXRoIGNnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNocm9tb3NvbWUgWSBETVJjYXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJEaWZmZXJlbmNlIiA9IGMoIi0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iLmNoclkucHJvYmVzLmRldGVjdFAgLSBuYi5jaHJZLnByb2JlcyAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWS5wcm9iZXMuZGV0ZWN0UC5jZyAtIG5iLmNoclkucHJvYmVzLmRldGVjdFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmIuY2hyWS5wcm9iZXMuY2cuZG1yY2F0ZSAtIG5iLmNoclkucHJvYmVzLmRldGVjdFAuY2cpCikKZGYuY2hyWS5wcm9iZXMKYGBgCgpgYGB7UiwgZXZhbCA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CnNhdmUoZGYuc2FtcGxlcyxkZi5wcm9iZXMsZmlsZSA9IGZpbGUucGF0aChkYXRhLmRpci50YWJsZSwgIi9HQVNQQVJPTklfdGFibGUucmRhIikpCmBgYAoKPCEtLSAjIENvbXB1dGUgbmV1cm9uIHByb3BvcnRpb24gLS0+Cgo8IS0tIERhdGEgZnJvbSAgaHR0cHM6Ly93d3cudGFuZGZvbmxpbmUuY29tL2RvaS9mdWxsLzEwLjQxNjEvZXBpLjIzOTI0IC0tPgoKPCEtLSAtIElucHV0OiBHYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWQuUkRTLCBwaGVub19kZi5SRFMgLS0+Cgo8IS0tIC0gT3V0cHV0OiBwaGVub193aXRoTmV1cm9uUHJvcF9kZi5SRFMgLS0+Cgo8IS0tIGBgYHtSfSAtLT4KPCEtLSBvYmplY3RzIDwtIGxvYWQoIi4uLy4uL0NFVC9DRVRTX0ltYWdlLlJEYXRhIikgLS0+CjwhLS0gb2JqZWN0cyAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMjIEdldCByZWZlcmVuY2UgcHJvZmlsZSBmcm9tIENhdWNhc2lvbnMgKyBjb250cm9scyAgLS0+CjwhLS0gYGBge1J9IC0tPgo8IS0tIGlkeCA8LSBsaXN0KCAtLT4KPCEtLSAgIGNvbnRyb2xOZXVyb24gPSBwZEJyYWluJGNlbGx0eXBlID09ICJOIiAmIHBkQnJhaW4kZGlhZyA9PSAiQ29udHJvbCIgJiBwZEJyYWluJGV0aG5pY2l0eSA9PSAiQ2F1Y2FzaWFuIiwgLS0+CjwhLS0gICBjb250cm9sR2xpYSAgID0gcGRCcmFpbiRjZWxsdHlwZSA9PSAiRyIgJiBwZEJyYWluJGRpYWcgPT0gIkNvbnRyb2wiICYgcGRCcmFpbiRldGhuaWNpdHkgPT0gIkNhdWNhc2lhbiIgLS0+CjwhLS0gKSAtLT4KCjwhLS0gcmVmUHJvZmlsZSA8LSBnZXRSZWZlcmVuY2UoYnJhaW4sIGlkeCkgLS0+CgoKPCEtLSAjIyMjIyAyLiBFc3RpbWF0ZSBwcm9wb3J0aW9ucyBvZiBuZXVyb25zIGluIFBGQyBzYW1wbGVzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KCjwhLS0gIyMjIExpbWl0IHRvIDEwLDAwMCBjcGdzIGluIHRoZSByZWZQcm9maWxlIGRhdGFzZXQgLS0+CjwhLS0gcGZjIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLnBjYSwgIi9HYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWQuUkRTIikpICNkaW06IDQzMzY1NiA1OSAtLT4KCjwhLS0gc2VsZWN0ZWQgPC0gcm93bmFtZXMocGZjKSAlaW4lIHJvd25hbWVzKHJlZlByb2ZpbGUpIC0tPgoKPCEtLSBwZmMucmVmY3BncyA8LSBwZmNbc2VsZWN0ZWQsIF0gIC0tPgoKPCEtLSAjIyMgRXN0aW1hdGUgcHJvcG9ydGlvbiBvZiBuZXVyb25zIC0tPgo8IS0tIHByb3AgPC0gZGF0YS5mcmFtZShlc3RQcm9wb3J0aW9uKHBmYy5yZWZjcGdzLCBwcm9maWxlID0gcmVmUHJvZmlsZSkpIC0tPgo8IS0tIGNvbG5hbWVzKHByb3ApIDwtICJwcm9wLm5ldXJvbiIgLS0+Cgo8IS0tICMjIyMjIDMuIE1lcmdlIHBmYy5yZWZjcGdzIHdpdGggcGhlbm90eXBlIGZpbGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tIHBoZW5vIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLnBjYSwgIi9waGVub19kZi5SRFMiKSkgLS0+Cgo8IS0tIHBoZW5vX2ZpbmFsIDwtIG1lcmdlKCAtLT4KPCEtLSAgIHBoZW5vLCAtLT4KPCEtLSAgIHByb3AsIC0tPgo8IS0tICAgYnkueCA9ICJzYW1wbGUiLCAtLT4KPCEtLSAgIGJ5LnkgPSAicm93Lm5hbWVzIiAtLT4KPCEtLSApIC0tPgoKPCEtLSBzYXZlUkRTKHBoZW5vX2ZpbmFsLCBwYXN0ZTAoZGF0YS5kaXIubmV1cm9uLCAiL3BoZW5vX3dpdGhOZXVyb25Qcm9wX2RmLlJEUyIpKSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMgTGluZWFyIHJlZ3Jlc3Npb24gYnkgY3BncyBNZXRoeWxhdGlvbiAgLS0+Cgo8IS0tIElucHV0OiAgLS0+Cgo8IS0tIC0gR2FzcGFyb25pX1FOQk1JUV9QQ2ZpbHRlcmVkLlJEUywgLS0+CjwhLS0gLSBwaGVubzU5X3dpdGhOZXVyb25Qcm9wX2RmLlJEUyAtLT4KCjwhLS0gT3V0cHV0OiAtLT4KCjwhLS0gLSBHYXNwYXJvbmlfc2luZ2xlX2NwZ19wVmFsX2RmLmNzdiAtLT4KCjwhLS0gIyMgSW1wb3J0IGRhdGFzZXRzIC0tPgoKPCEtLSBgYGB7Un0gLS0+CjwhLS0gYmV0YV9tYXQgPC0gcmVhZFJEUyhwYXN0ZTAoZGF0YS5kaXIucGNhLCAiL0dhc3Bhcm9uaV9RTkJNSVFfUENmaWx0ZXJlZC5SRFMiKSkgIC0tPgo8IS0tIHBoZW5vX2RmIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLm5ldXJvbiwgIi9waGVub193aXRoTmV1cm9uUHJvcF9kZi5SRFMiKSkgIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gIyMgVGVzdCBhbGwgY3BncyAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBUUlVFfSAtLT4KPCEtLSAjIyMgQ29tcHV0ZSBNIHZhbHVlcyAtLT4KPCEtLSBtdmFsX21hdCA8LSBsb2cyKGJldGFfbWF0IC8gKDEgLSBiZXRhX21hdCkpIC0tPgoKPCEtLSBwaGVub19kZiRTYW1wbGUgPC0gcGhlbm9fZGYkc2FtcGxlIC0tPgoKPCEtLSBpZGVudGljYWwocGhlbm9fZGYkU2FtcGxlLCBjb2xuYW1lcyhtdmFsX21hdCkpIC0tPgoKPCEtLSBwaGVub19kZiRzZXggPC0gYXMuZmFjdG9yKHBoZW5vX2RmJHNleCkgLS0+CjwhLS0gcGhlbm9fZGYkc2xpZGUgPC0gYXMuZmFjdG9yKHBoZW5vX2RmJHNsaWRlKSAtLT4KPCEtLSAjIElmIHJvc21hcCBjb2hvcnQsIGRvbid0IGZvcmdldCBiYXRjaCBlZmZlY3QgLS0+Cgo8IS0tIHN0cihwaGVub19kZikgLS0+Cgo8IS0tIGlzKHBoZW5vX2RmJHN0YWdlLCJudW1lcmljIikgLS0+CjwhLS0gaXMocGhlbm9fZGYkYWdlLmJyYWluLCJudW1lcmljIikgLS0+CjwhLS0gaXMocGhlbm9fZGYkcHJvcC5uZXVyb24sIm51bWVyaWMiKSAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSBgYGB7UiwgZXZhbCA9IEZBTFNFfSAtLT4KPCEtLSBwcmVkaWN0b3JzX2NoYXIgPC0gInN0YWdlIiAtLT4KPCEtLSBjb3ZhcmlhdGVzX2NoYXIgPC0gYygiYWdlLmJyYWluIiwgInNleCIsICJwcm9wLm5ldXJvbiIsICJzbGlkZSIpIC0tPgoKCjwhLS0gZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gcGFyYWxsZWw6OmRldGVjdENvcmVzKCkvMikgLS0+CjwhLS0gZGV2dG9vbHM6OnNvdXJjZV9naXN0KCJodHRwczovL2dpc3QuZ2l0aHViLmNvbS90aWFnb2Noc3QvZDNhN2IxNjM5YWNmNjAzOTE2YzMxNWQyM2IxZWZiM2UiKSAtLT4KCjwhLS0gcmVzdWx0c19vcmRlcmVkX2RmIDwtIHBseXI6OmFkcGx5KG12YWxfbWF0LDEsIGZ1bmN0aW9uKHJvdyl7IC0tPgoKPCEtLSAgIHN1bU9uZVJlZ2lvbl9kZiA8LSBkYXRhLmZyYW1lKHQocm93KSkgLS0+Cgo8IS0tICAgcmVzdWx0IDwtIFRlc3RTaW5nbGVSZWdpb24oIC0tPgo8IS0tICAgICBwcmVkaWN0b3JzX2NoYXIgPSBwcmVkaWN0b3JzX2NoYXIsIC0tPgo8IS0tICAgICBjb3ZhcmlhdGVzX2NoYXIgPSBjb3ZhcmlhdGVzX2NoYXIsIC0tPgo8IS0tICAgICBwaGVub19kZiA9IHBoZW5vX2RmLCAtLT4KPCEtLSAgICAgc3VtT25lUmVnaW9uX2RmID0gc3VtT25lUmVnaW9uX2RmIC0tPgo8IS0tICAgKSAtLT4KPCEtLSAgIHJlc3VsdCAtLT4KPCEtLSB9LCAucHJvZ3Jlc3MgPSAidGltZSIsLnBhcmFsbGVsID0gVFJVRSwuaWQgPSAiY3BnIikgLS0+CjwhLS0gY29sbmFtZXMocmVzdWx0c19vcmRlcmVkX2RmKVsxXSA8LSAiY3BnIiAtLT4KCjwhLS0gaWRlbnRpY2FsKHJvdy5uYW1lcyhtdmFsX21hdCksIHJlc3VsdHNfb3JkZXJlZF9kZiRjcGcgJT4lIGFzLmNoYXJhY3RlcigpKSAtLT4KCjwhLS0gcmVzdWx0c19vcmRlcmVkX2RmJGZkciA8LSBwLmFkanVzdCggLS0+CjwhLS0gICAgIHJlc3VsdHNfb3JkZXJlZF9kZiRwVmFsdWUsIC0tPgo8IS0tICAgICBtZXRob2QgPSAiZmRyIiAtLT4KPCEtLSApIC0tPgoKPCEtLSB3cml0ZS5jc3YoIC0tPgo8IS0tICAgcmVzdWx0c19vcmRlcmVkX2RmLCAtLT4KPCEtLSAgIHBhc3RlMChkYXRhLmRpci5zaW5nbGUuY3BnLnB2YWwsICIvR2FzcGFyb25pX3NpbmdsZV9jcGdfcFZhbF9kZi5jc3YiKSwgLS0+CjwhLS0gICByb3cubmFtZXMgPSBGQUxTRSAtLT4KPCEtLSApIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge1J9IC0tPgo8IS0tIHJlc3VsdHNfb3JkZXJlZF9kZiA8LSByZWFkcjo6cmVhZF9jc3YoIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnNpbmdsZS5jcGcucHZhbCwgIi9HYXNwYXJvbmlfc2luZ2xlX2NwZ19wVmFsX2RmLmNzdiIpLCAtLT4KPCEtLSAgIGNvbF90eXBlcyA9IHJlYWRyOjpjb2xzKCkpIC0tPgo8IS0tIHJlc3VsdHNfb3JkZXJlZF9kZiAtLT4KPCEtLSBgYGAgLS0+CgoKPCEtLSAjIExpbmVhciByZWdyZXNzaW9uIGJ5IHJlZ2lvbnMgbWVkaWFuIE1ldGh5bGF0aW9uICAtLT4KCjwhLS0gIyMgUmVzaWR1YWxzIGNvbnRyb2wgYW5kIGNvTWV0aHlsYXRlZCBSZWdpb25zIC0tPgoKPCEtLSAxLiBUYWtlIHJlc2lkdWFscyAtLT4KPCEtLSAyLiBGaW5kIGNvLW1ldGh5bGF0ZWQgcmVnaW9ucyAtLT4KCjwhLS0gSW5wdXQ6ICAtLT4KCjwhLS0gLSBRTkJNSVFfUENmaWx0ZXJlZCAtLT4KPCEtLSAtIHBoZW5vX3dpdGhOZXVyb25Qcm9wX2RmIC0tPgoKPCEtLSBPdXRwdXQ6ICAtLT4KCjwhLS0gLSBRTkJNSVFfUENmaWx0ZXJlZF9tdmFsUmVzaWR1YWxzIC0tPgo8IS0tIC0gcmVzaWR1YWxzX2NvbWV0aF9scyAtLT4KCjwhLS0gIyMjIFJlc2lkdWFscyAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBGQUxTRX0gLS0+CjwhLS0gIyMjIyMgMS4gSW1wb3J0IGRhdGFzZXRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gYmV0YV9tYXQgPC0gcmVhZFJEUyhwYXN0ZTAoZGF0YS5kaXIucGNhLCAiL0dhc3Bhcm9uaV9RTkJNSVFfUENmaWx0ZXJlZC5SRFMiKSkgI2RpbTo0MzM2NTYgNTkgLS0+CjwhLS0gcGhlbm9fZGYgPC0gcmVhZFJEUyhwYXN0ZTAoZGF0YS5kaXIubmV1cm9uLCAiL3BoZW5vX3dpdGhOZXVyb25Qcm9wX2RmLlJEUyIpKSAjZGltOjU5IDcgLS0+Cgo8IS0tICMjIyBDb21wdXRlIE0gdmFsdWVzIC0tPgo8IS0tIG12YWx1ZV9tYXQgPC0gbG9nMihiZXRhX21hdCAvICgxIC0gYmV0YV9tYXQpKSAtLT4KCjwhLS0gIyMjIFJlb3JkZXIgc2FtcGxlcyBiYXNlZCBvbiBwaGVub19kZiAtLT4KPCEtLSBtdmFsdWVfbWF0IDwtIG12YWx1ZV9tYXRbLCBwaGVub19kZiRzYW1wbGVdIC0tPgoKPCEtLSBpZGVudGljYWwoY29sbmFtZXMobXZhbHVlX21hdCksICBwaGVub19kZiRzYW1wbGUpIC0tPgoKPCEtLSAjIyMgVGFrZSByZXNpZHVhbHMgLS0+CjwhLS0gbG1GIDwtIGZ1bmN0aW9uKG12YWwpeyAtLT4KPCEtLSAgIGZpdEUgPC0gbG0oIC0tPgo8IS0tICAgICBhcy5udW1lcmljKG12YWwpIH4gYWdlLmJyYWluICsgc2V4ICsgcHJvcC5uZXVyb24gKyBhcy5jaGFyYWN0ZXIoc2xpZGUpLCAjYWRkIGJhdGNoIGlmIHJvc21hcCAtLT4KPCEtLSAgICAgZGF0YSA9IHBoZW5vX2RmLCAtLT4KPCEtLSAgICAgbmEuYWN0aW9uID0gbmEuZXhjbHVkZSAtLT4KPCEtLSAgICkgLS0+CjwhLS0gICByZXNpZHVhbHMgKGZpdEUpIC0tPgo8IS0tIH0gLS0+CjwhLS0gZG9QYXJhbGxlbDo6cmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmVzID0gNCkgLS0+CjwhLS0gcmVzaWQgPC0gcGx5cjo6YWRwbHkobXZhbHVlX21hdCwxLC5mdW4gPSBsbUYsLnByb2dyZXNzID0gInRpbWUiLC5wYXJhbGxlbCA9IFRSVUUpIC0tPgo8IS0tIHJvd25hbWVzKHJlc2lkKSA8LSByZXNpZFssMV0gLS0+CjwhLS0gcmVzaWRbLDFdIDwtIE5VTEwgLS0+CjwhLS0gY29sbmFtZXMocmVzaWQpIDwtIGNvbG5hbWVzKG12YWx1ZV9tYXQpIC0tPgo8IS0tIGRpbShyZXNpZCkgLS0+CjwhLS0gZGltKG12YWx1ZV9tYXQpIC0tPgoKPCEtLSAjIyMgU2F2ZSBkYXRhc2V0IC0tPgo8IS0tIHNhdmVSRFMoIC0tPgo8IS0tICAgcmVzaWQsIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnJlc2lkdWFscywgIi9HYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWRfbXZhbFJlc2lkdWFscy5SRFMiKSAtLT4KPCEtLSApIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gIyMjIEZpbmQgY28tbWV0aHlsYXRlZCByZWdpb25zIC0tPgoKPCEtLSBgYGB7UiwgZXZhbCA9IEZBTFNFfSAtLT4KPCEtLSAjIyMgSW1wb3J0IGRhdGFzZXRzIC0tPgo8IS0tIG12YWx1ZV9yZXNpZHVhbHNfbWF0IDwtIHJlYWRSRFMoIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnJlc2lkdWFscywgIi9HYXNwYXJvbmlfUU5CTUlRX1BDZmlsdGVyZWRfbXZhbFJlc2lkdWFscy5SRFMiKSAtLT4KPCEtLSApIC0tPgoKPCEtLSAjIyMgQ2FsbCBpbiBmdW5jdGlvbnMgLS0+CjwhLS0gbGlicmFyeShjb01ldGhETVIpIC0tPgo8IS0tIGxpYnJhcnkoQmlvY1BhcmFsbGVsKSAtLT4KCjwhLS0gcHJvYmVzLmNsdXN0ZXIuYWxsIDwtIGNvTWV0aERNUjo6Z2V0UHJlZGVmaW5lZENsdXN0ZXIoYXJyYXlUeXBlID0gIjQ1MGsiLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyVHlwZSA9ICJyZWdpb25zIikgLS0+Cgo8IS0tIG5jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKS8yIC0tPgo8IS0tICMjIyBGaW5kIGNvLW1ldGh5bGF0ZWQgY2x1c3RlcnMgLS0+CjwhLS0gY29NZXRoX2xzIDwtIENvTWV0aEFsbFJlZ2lvbnMoIC0tPgo8IS0tICAgZG5hbSA9IG12YWx1ZV9yZXNpZHVhbHNfbWF0LCAgICAgICAtLT4KPCEtLSAgIGJldGFUb00gPSBGQUxTRSwgICAgICAgICAgICAgICAgICAgIC0tPgo8IS0tICAgQ3BHc19scyA9IHByb2Jlcy5jbHVzdGVyLmFsbCwgLS0+CjwhLS0gICBhcnJheVR5cGUgPSAiNDUwayIsIC0tPgo8IS0tICAgckRyb3BUaHJlc2hfbnVtID0gMC40LCAtLT4KPCEtLSAgIG1pblBhaXJ3aXNlQ29yciA9IE5VTEwsIC0tPgo8IS0tICAgbWV0aG9kID0gInNwZWFybWFuIiwgICAgICAgICAgICAgIC0tPgo8IS0tICAgcmV0dXJuQWxsQ3BHcyA9IFRSVUUsICAgICAgICAgICAgICAgLS0+CjwhLS0gICBvdXRwdXQgPSAiYWxsIiwgLS0+CjwhLS0gICBuQ29yZXNfaW50ID0gbmNvcmVzLCAtLT4KPCEtLSAgIHByb2dyZXNzYmFyID0gRkFMU0UgLS0+CjwhLS0gKSAtLT4KCjwhLS0gc2F2ZVJEUyggLS0+CjwhLS0gICBjb01ldGhfbHMsIC0tPgo8IS0tICAgcGFzdGUwKGRhdGEuZGlyLnJlc2lkdWFscywiL0dhc3Bhcm9uaV9yZXNpZHVhbHNfY29tZXRoX2lucHV0X2xzLlJEUyIpIC0tPgo8IS0tICkgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSAjIyBMaW5lYXIgcmVncmVzc2lvbiBieSByZWdpb25zIG1lZGlhbiBNZXRoeWxhdGlvbiAgLS0+Cgo8IS0tIDEuIENhbGN1bGF0ZSBtZWRpYW5zIGJ5IGNsdXN0ZXIgYW5kIHNhbXBsZSAtLT4KPCEtLSAyLiBsaW5lYXIgcmVncmVzc2lvbiAtLT4KCjwhLS0gSW5wdXQ6ICAtLT4KCjwhLS0gLSBRTkJNSVFfUENmaWx0ZXJlZCwgLS0+CjwhLS0gLSBwaGVub193aXRoTmV1cm9uUHJvcF9kZiAtLT4KPCEtLSAtIHJlc2lkdWFsc19jb21ldGhfaW5wdXRfbHMgLS0+Cgo8IS0tIE91dHB1dDogIC0tPgoKPCEtLSAtIGluZm9fZGYgLS0+CjwhLS0gLSBtZWRpYW5zTXZhbF9kZiAtLT4KPCEtLSAtIGxpbmVhcl9kZl9hZ2luZyAtLT4KCjwhLS0gIyMjIENhbGN1bGF0ZSBtZWRpYW5zIGJ5IGNsdXN0ZXIgYW5kIHNhbXBsZSAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBGQUxTRX0gLS0+CjwhLS0gIyMjIEltcG9ydCBkYXRhc2V0cyAtLT4KPCEtLSBiZXRhX21hdCA8LSByZWFkUkRTKHBhc3RlMChkYXRhLmRpci5wY2EsIC0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvR2FzcGFyb25pX1FOQk1JUV9QQ2ZpbHRlcmVkLlJEUyIpKSAtLT4KPCEtLSBwaGVub19kZiA8LSByZWFkUkRTKHBhc3RlMChkYXRhLmRpci5uZXVyb24sICIvcGhlbm9fd2l0aE5ldXJvblByb3BfZGYuUkRTIikpIC0tPgo8IS0tIG12YWxfbWF0IDwtIGxvZzIoYmV0YV9tYXQgLyAoMSAtIGJldGFfbWF0KSkgJT4lIGFzLm1hdHJpeCgpIC0tPgo8IS0tIGNvTWV0aF9scyA8LSByZWFkUkRTKCAtLT4KPCEtLSAgIHBhc3RlMChkYXRhLmRpci5yZXNpZHVhbHMsICIvR2FzcGFyb25pX3Jlc2lkdWFsc19jb21ldGhfaW5wdXRfbHMuUkRTIikgLS0+CjwhLS0gKSAtLT4KCjwhLS0gIyMjIENyZWF0ZSBpbmZvIGRhdGFzZXQgLS0+CjwhLS0gaW5wdXRfY29tZXRoIDwtIGRhdGEuZnJhbWUoIC0tPgo8IS0tICAgaW5wdXRSZWdpb24gPSBjb01ldGhfbHMkaW5wdXRSZWdpb25fY2hyLCAtLT4KPCEtLSAgIG5Db01ldGhSZWdpb24gPSBjb01ldGhfbHMkbkNvTWV0aFJlZ2lvbnNfbnVtLCAtLT4KPCEtLSAgIGNvTWV0aFJlZ2lvbiA9IG5hbWVzKGNvTWV0aF9scyRjb01ldGhfbHMpLCAtLT4KPCEtLSAgIG5DcEdzID0gdW5saXN0KGxhcHBseShjb01ldGhfbHMkY29NZXRoX2xzLCBsZW5ndGgpLCB1c2UubmFtZXMgPSBGQUxTRSksIC0tPgo8IS0tICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFIC0tPgo8IS0tICkgLS0+Cgo8IS0tIGlucHV0X2NvbWV0aF9ub2R1cCA8LSBpbnB1dF9jb21ldGhbIC0tPgo8IS0tICAgIWR1cGxpY2F0ZWQoaW5wdXRfY29tZXRoJGNvTWV0aFJlZ2lvbiksIC0tPgo8IS0tICAgXSAtLT4KPCEtLSBjb2xuYW1lcyhpbnB1dF9jb21ldGhfbm9kdXApIDwtIGMoIC0tPgo8IS0tICAgcGFzdGUwKGNvaG9ydCwgIl9pbnB1dFJlZ2lvbiIpLCAtLT4KPCEtLSAgIHBhc3RlMChjb2hvcnQsICJfbkNvTWV0aFJlZ2lvbiIpLCAtLT4KPCEtLSAgIHBhc3RlMChjb2hvcnQsICJfY29NZXRoUmVnaW9uIiksIC0tPgo8IS0tICAgcGFzdGUwKGNvaG9ydCwgIl9uQ3BHcyIpIC0tPgo8IS0tICkgLS0+Cgo8IS0tIHNhdmVSRFMoIC0tPgo8IS0tICAgaW5wdXRfY29tZXRoX25vZHVwLCAtLT4KPCEtLSAgIHBhc3RlMChkYXRhLmRpci5tZWRpYW4sIGNvaG9ydCwiX2luZm9fZGYucmRzIikgLS0+CjwhLS0gKSAtLT4KCjwhLS0gIyMjIFRha2UgbWVkaWFuIG9mIHByb2JlcyBpbiBlYWNoIGNsdXN0ZXIgZm9yIGVhY2ggc2FtcGxlIC0tPgo8IS0tIGZpbGVuYW1lIDwtICBwYXN0ZTAocGFzdGUwKGRhdGEuZGlyLm1lZGlhbiwgY29ob3J0LCAiX21lZGlhbnNNdmFsX2RmLnJkcyIpKSAtLT4KPCEtLSBsaWJyYXJ5KHJvYnVzdGJhc2UpIC0tPgo8IS0tIG12YWxfbWF0IDwtIG12YWxfbWF0W3Jvd25hbWVzKG12YWxfbWF0KSAlaW4lIHVubGlzdChjb01ldGhfbHMkY29NZXRoX2xzKSxdIC0tPgo8IS0tIGlmKCFmaWxlLmV4aXN0cyhmaWxlbmFtZSkpeyAtLT4KPCEtLSAgIG1lZGlhbk12YWwuZGYgPC0gcGx5cjo6bGRwbHkoIC0tPgo8IS0tICAgICBjb01ldGhfbHMkY29NZXRoX2xzWyFkdXBsaWNhdGVkKG5hbWVzKGNvTWV0aF9scyRjb01ldGhfbHMpKV0sIC0tPgo8IS0tICAgICBmdW5jdGlvbihwcm9iZXMpeyAtLT4KPCEtLSAgICAgICBjb2xNZWRpYW5zKG12YWxfbWF0W2FzLmNoYXJhY3Rlcihwcm9iZXMpLF0sIG5hLnJtID0gVFJVRSkgLS0+CjwhLS0gICAgIH0sIC0tPgo8IS0tICAgICAucHJvZ3Jlc3MgPSAidGltZSIgLS0+CjwhLS0gICApIC0tPgo8IS0tICAgbWVkaWFuTXZhbC5kZiQuaWQgPC0gTlVMTCAtLT4KPCEtLSAgIGNvbG5hbWVzKG1lZGlhbk12YWwuZGYpIDwtIGNvbG5hbWVzKG12YWxfbWF0KSAtLT4KPCEtLSAgIHNhdmVSRFMobWVkaWFuTXZhbC5kZiwgZmlsZSA9IGZpbGVuYW1lKSAtLT4KPCEtLSB9IGVsc2UgeyAtLT4KPCEtLSAgIG1lZGlhbk12YWwuZGYgPC0gcmVhZFJEUyhmaWxlbmFtZSkgLS0+CjwhLS0gfSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMjIyBUZXN0IGFsbCByZWdpb25zIC0tIGxpbmVhciByZWdyZXNzaW9ucyAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBUUlVFfSAtLT4KPCEtLSAjIyMgSW1wb3J0IGRhdGFzZXRzIC0tPgo8IS0tIGNvaG9ydCA8LSAiR2FzcGFyb25pIiAtLT4KPCEtLSBpbmZvX2RmIDwtIHJlYWRSRFMoZGlyKGRhdGEuZGlyLm1lZGlhbiwgcGF0dGVybiA9ICJpbmZvIiwgZnVsbC5uYW1lcyA9IFRSVUUpKSAtLT4KPCEtLSBtZWRpYW5zTXZhbF9kZiA8LSByZWFkUkRTKGRpcihkYXRhLmRpci5tZWRpYW4sIHBhdHRlcm4gPSAibWVkaWFuc012YWwiLCBmdWxsLm5hbWVzID0gVFJVRSkpIC0tPgo8IS0tIHBoZW5vX2RmIDwtIHJlYWRSRFMocGFzdGUwKGRhdGEuZGlyLm5ldXJvbiwgIi9waGVub193aXRoTmV1cm9uUHJvcF9kZi5SRFMiKSkgIC0tPgoKPCEtLSAjIyMgQ2hlY2sgdmFyaWFibGVzIGJlZm9yZSBmaXR0aW5nIG1vZGVsIC0tPgo8IS0tIHBoZW5vX2RmJFNhbXBsZSA8LSBwaGVub19kZiRzYW1wbGUgLS0+CjwhLS0gaWRlbnRpY2FsKHBoZW5vX2RmJFNhbXBsZSwgY29sbmFtZXMobWVkaWFuc012YWxfZGYpKSAtLT4KCjwhLS0gcGhlbm9fZGYkc2V4IDwtIGFzLmZhY3RvcihwaGVub19kZiRzZXgpIC0tPgo8IS0tIHBoZW5vX2RmJHNsaWRlIDwtIGFzLmZhY3RvcihwaGVub19kZiRzbGlkZSkgLS0+CjwhLS0gIyBJZiByb3NtYXAgY29ob3J0LCBkb24ndCBmb3JnZXQgYmF0Y2ggZWZmZWN0IC0tPgoKPCEtLSBzdHIocGhlbm9fZGYpIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge1IsIGV2YWwgPSBGQUxTRX0gLS0+CjwhLS0gZGV2dG9vbHM6OnNvdXJjZV9naXN0KCJodHRwczovL2dpc3QuZ2l0aHViLmNvbS90aWFnb2Noc3QvZDNhN2IxNjM5YWNmNjAzOTE2YzMxNWQyM2IxZWZiM2UiKSAtLT4KCjwhLS0gcHJlZGljdG9yc19jaGFyIDwtICJzdGFnZSIgLS0+CjwhLS0gY292YXJpYXRlc19jaGFyIDwtIGMoImFnZS5icmFpbiIsICJzZXgiLCAicHJvcC5uZXVyb24iLCAic2xpZGUiKSAtLT4KCjwhLS0gcmVzX2RmIDwtIFRlc3RBbGxSZWdpb25zX25vSW5mbyggLS0+CjwhLS0gICBwcmVkaWN0b3JzX2NoYXIgPSBwcmVkaWN0b3JzX2NoYXIsIC0tPgo8IS0tICAgY292YXJpYXRlc19jaGFyID0gY292YXJpYXRlc19jaGFyLCAtLT4KPCEtLSAgIHBoZW5vX2RmID0gcGhlbm9fZGYsIC0tPgo8IS0tICAgc3VtbWFyaXplZFJlZ2lvbnNfZGYgPSBtZWRpYW5zTXZhbF9kZiAtLT4KPCEtLSApIC0tPgoKPCEtLSBjb2xuYW1lcyhyZXNfZGYpIDwtIGMoIC0tPgo8IS0tICAgcGFzdGUwKGNvaG9ydCwgIl9lc3RpbWF0ZSIpLCAtLT4KPCEtLSAgIHBhc3RlMChjb2hvcnQsICJfc2UiKSwgLS0+CjwhLS0gICBwYXN0ZTAoY29ob3J0LCAiX3BWYWwiKSwgLS0+CjwhLS0gICBwYXN0ZTAoY29ob3J0LCAiX2ZkciIpIC0tPgo8IS0tICkgLS0+Cgo8IS0tIHJlc193aXRoSW5mb19kZiA8LSBjYmluZChpbmZvX2RmLCByZXNfZGYpIC0tPgoKPCEtLSBzYXZlUkRTKCAtLT4KPCEtLSAgIHJlc193aXRoSW5mb19kZiwgLS0+CjwhLS0gICBwYXN0ZTAoZGF0YS5kaXIubWVkaWFuLCAgY29ob3J0LCAiX2xpbmVhcl9kZi5yZHMiKSAtLT4KPCEtLSApIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge1J9IC0tPgo8IS0tIGZpbGUgPC0gZGlyKGRhdGEuZGlyLm1lZGlhbixwYXR0ZXJuID0gcGFzdGUwKCIuKmxpbmVhcl9kZiIpLCAtLT4KPCEtLSAgICAgICAgICAgICByZWN1cnNpdmUgPSBULCAtLT4KPCEtLSAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVFJVRSwgLS0+CjwhLS0gICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBUKSAtLT4KPCEtLSBmaWxlIC0tPgo8IS0tIHJlc193aXRoSW5mb19kZiA8LSByZWFkUkRTKGZpbGUpIC0tPgo8IS0tIGRpbShyZXNfd2l0aEluZm9fZGYpIC0tPgo8IS0tIHJlc193aXRoSW5mb19kZiAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMgRGF0YSBmaW5hbCAtLT4KCjwhLS0gYGBge1J9IC0tPgo8IS0tIGRpcihwYXRoID0gZGF0YS5kaXIscmVjdXJzaXZlID0gVCwgcGF0dGVybiA9ICIucmRhfC5jc3Z8LlJEUyIpIC0tPgo8IS0tIGBgYCAtLT4KCiMgU2Vzc2lvbiBpbmZvcm1hdGlvbgpgYGB7Un0KZGV2dG9vbHM6OnNlc3Npb25faW5mbygpCmBgYAo=